摘要:并把最終的隨機(jī)數(shù)輸出到控制臺。方法,在集合中如何存儲元素取決于方法的返回值返回,集合中只有一個元素。創(chuàng)建集合對象,傳入比較器。
1_HashSet存儲字符串并遍歷
A:Set集合概述及特點(diǎn)
通過API查看即可
B:案例演示
HashSet存儲字符串并遍歷
import java.util.HashSet; public class Demo1_HashSet { public static void main(String[] args) { //Set集合,無索引,不可以重復(fù),無序(存取不一致) HashSet2_HashSet存儲自定義對象保證元素唯一性hs = new HashSet<>(); //創(chuàng)建HashSet對象 boolean b1 = hs.add("a"); boolean b2 = hs.add("a"); //當(dāng)向Set集合中儲存重復(fù)元素的時(shí)候返回為false hs.add("b"); hs.add("c"); hs.add("d"); System.out.println(hs); //HashSet的繼承體現(xiàn)中有重寫toString方法 System.out.println(b1); System.out.println(b2); for (String string : hs) { //只要能用迭代器迭代的,就可以使用增強(qiáng)for循環(huán)遍歷 System.out.println(string); } } }
A:案例演示
存儲自定義對象,并保證元素唯一性。
重寫hashCode()和equals()方法
B:畫圖演示
畫圖說明比較過程
C:代碼優(yōu)化
為了減少比較,優(yōu)化hashCode()代碼寫法。
最終版就是自動生成即可。
代碼寫的復(fù)雜,目的就是為了少調(diào)用equals方法,提高我們程序運(yùn)行的效率
D:原理
1.HashSet原理
我們使用Set集合都是需要去掉重復(fù)元素的, 如果在存儲的時(shí)候逐個equals()比較, 效率較低;哈希算法提高了去重復(fù)的效率, 降低了使用equals()方法的次數(shù)
當(dāng)HashSet調(diào)用add()方法存儲對象的時(shí)候, 先調(diào)用對象的hashCode()方法得到一個哈希值(如同上火車先有票), 然后在集合中查找是否有哈希值相同的對象
如果沒有哈希值相同的對象就直接存入集合
如果有哈希值相同的對象, 就和哈希值相同的對象逐個進(jìn)行equals()比較,比較結(jié)果為false就存入, true則不存
2.將自定義類的對象存入HashSet去重復(fù)
類中必須重寫hashCode()和equals()方法
hashCode(): 屬性相同的對象返回值必須相同, 屬性不同的返回值盡量不同(提高效率)
equals(): 屬性相同返回true, 屬性不同返回false,返回false的時(shí)候存儲
import java.util.HashSet; import net.allidea.bean.Person; public class Demo1_HashSet { public static void main(String[] args) { HashSeths = new HashSet<>(); hs.add(new Person("張三",23)); hs.add(new Person("張三",23)); hs.add(new Person("李四",24)); hs.add(new Person("李四",24)); hs.add(new Person("李四",24)); // System.out.println(hs.size()); System.out.println(hs); } }
//Person文件 public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } //為什么是31? 1.是質(zhì)數(shù)。2.既不大也不小。3.是2的五次方-1,2向左移動五位 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) //調(diào)用的對象和傳入的對象是同一個對象 return true; if (obj == null) //傳入的對象為NULL return false; if (getClass() != obj.getClass()) //判斷兩個對象對應(yīng)的字節(jié)碼文件是否是同一個字節(jié)碼 return false; Person other = (Person) obj; //向下轉(zhuǎn)型 if (age != other.age) //調(diào)用對象的年齡不等于傳入對象的年齡 return false; if (name == null) { //調(diào)用對象的姓名為null if (other.name != null) return false; } else if (!name.equals(other.name)) //調(diào)用對象的姓名不等于傳入對象的姓名 return false; return true; } /* @Override public boolean equals(Object obj) { System.out.println("執(zhí)行了嗎"); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } @Override public int hashCode() { //return 10; //return age; final int NUM = 38; return name.hashCode() * NUM + age; }*/ }3_LinkedHashSet的概述和使用
A:LinkedHashSet的特點(diǎn)(Linked代表的是鏈表實(shí)現(xiàn)的,HashSet代表的是屬于HashSet派系的)
B:LinkedHashSet的特點(diǎn)
可以保證怎么存就怎么取
1.底層是鏈表實(shí)現(xiàn)的,是Set集合中唯一一個能保證怎么存就怎么取的集合對象
2.因?yàn)槭荋ashSet的子類,所以也保證了元素是唯一的,與HashSet的原理一樣
import java.util.LinkedHashSet; public class Demo2_LinkedHashSet { public static void main(String[] args) { LinkedHashSet4_產(chǎn)生10個1-20之間的隨機(jī)數(shù)要求隨機(jī)數(shù)不能重復(fù)lhs = new LinkedHashSet<>(); lhs.add("a"); lhs.add("a"); lhs.add("a"); lhs.add("b"); lhs.add("c"); lhs.add("d"); System.out.println(lhs); } }
A:案例演示
需求:編寫一個程序,獲取10個1至20的隨機(jī)數(shù),要求隨機(jī)數(shù)不能重復(fù)。并把最終的隨機(jī)數(shù)輸出到控制臺。
import java.util.HashSet; import java.util.Random; public class Demo3_test { public static void main(String[] args) { Random r = new Random(); //1.創(chuàng)建Random隨機(jī)數(shù)對象 HashSet5_練習(xí)hs = new HashSet<>(); //2.需要存儲10個隨機(jī)數(shù),不能重復(fù),用HashSet集合 while(hs.size() < 10) { //3.如果HashSet的size<10就可以不斷的存儲,如果>=10就停止存儲 hs.add(r.nextInt(20) + 1); //4.通過Random類中的nextInt(n)方法,獲取1-20之間的隨機(jī)數(shù), } //并將這些隨機(jī)數(shù)存儲在HashSet集合中 for (Integer integer : hs) { //5.遍歷HashSet System.out.println(integer); } } }
使用Scanner從鍵盤讀取一行輸入,去掉其中重復(fù)字符, 打印出不同的那些字符
import java.util.HashSet; import java.util.Scanner; public class Demo2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //1.創(chuàng)建Scanner對象 System.out.println("請輸入一行字符串:"); HashSet6_練習(xí)hs = new HashSet<>(); //2.創(chuàng)建HashSet對象,將字符存儲去掉重復(fù) String line = sc.nextLine(); char[] arr = line.toCharArray(); //3.將字符串轉(zhuǎn)換為字符數(shù)組,獲取每一個字符存儲在HashSet集合中,自動去除重復(fù) for (char c : arr) { //4.遍歷字符數(shù)組 hs.add(c); } for(Character ch : hs) { //5.自動拆箱,遍歷HashSet,打印每一個字符 System.out.println(ch); } } }
需求: 將集合中的重復(fù)元素去掉
import java.util.List; import java.util.ArrayList; import java.util.LinkedHashSet; public class Demo3 { public static void main(String[] args) { ArrayList7_TreeSet存儲Integer類型的元素并遍歷list = new ArrayList<>();//1.創(chuàng)建List集合存儲若干個重復(fù)元素 list.add("a"); list.add("a"); list.add("b"); list.add("b"); list.add("b"); list.add("c"); getSingle(list); //2.多帶帶定義方法去除重復(fù) System.out.println(list); //3.打印List集合 } public static void getSingle(List list) { LinkedHashSet lhs = new LinkedHashSet<>(); //1.創(chuàng)建一個LinkedHashSet集合 lhs.addAll(list); //2.將List集合中所有的元素添加到LinkedHashSet集合中,去重 list.clear(); //3.將List集合中的元素清空。 list.addAll(lhs); //4.將LinkedHashSet集合中的元素添加回List集合中 } }
A:案例演示
TreeSet存儲Integer類型的元素并遍歷
TreeSet是用來對元素進(jìn)行排序的,同樣也可以保證元素的唯一
import java.util.TreeSet; public class Demo3_TreeSet { public static void main(String[] args) { TreeSet8_TreeSet存儲自定義對象以及保證元素唯一和自然排序的原理ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(3); ts.add(3); ts.add(2); System.out.println(ts); } }
A:案例演示
存儲自定義Person對象
TreeSet集合是用來對象元素進(jìn)行排序的,同樣也可以保證元素的唯一
當(dāng)compareTo方法返回0的時(shí)候,集合中只有一個元素
當(dāng)compareTo方法返回正數(shù)的時(shí)候,集合會正序存儲(怎么存,就怎么取)
當(dāng)compareTo方法返回負(fù)數(shù)的時(shí)候,集合會倒序存儲
B:TreeSet保證元素唯一和自然排序的原理和圖解
原理
二叉樹——小的存儲在左邊(負(fù)數(shù)),大的存儲在右邊(正數(shù)),相等就不存(返回0)。
compareTo方法,在TreeSet集合中如何存儲元素取決于CopareTo方法的返回值
1.返回0,集合中只有一個元素。通過比較不存儲。
2.返回-1,存儲在根元素左邊。集合倒序
3.返回+1,集合怎么存就怎么取*/
import java.util.TreeSet; import net.allidea.bean.Person; public class Demo3_TreeSet { public static void main(String[] args) { TreeSetts = new TreeSet<>(); ts.add(new Person("張三",23)); ts.add(new Person("李四",24)); ts.add(new Person("李二",24)); ts.add(new Person("王五",25)); ts.add(new Person("趙六",46)); ts.add(new Person("田七",17)); System.out.println(ts); } private static void demo1() { TreeSet ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(3); ts.add(3); ts.add(2); System.out.println(ts); } }
//重寫Person文件中的compareTo @Override public int compareTo(Person o) { int num = this.age - o.age; //年齡是比較的主要條件,姓名是次要條件 return num == 0 ? this.name.compareTo(o.name) : num; }12_TreeSet存儲自定義對象并遍歷練習(xí)1
A:案例演示
TreeSet存儲自定義對象并遍歷練習(xí)1(按照姓名排序)
@Override //按照姓名排序 public int compareTo(Person o) { int num = this.name.compareTo(o.name); return num == 0 ? this.age - o.age : num; }13_TreeSet存儲自定義對象并遍歷練習(xí)2
A:案例演示
TreeSet存儲自定義對象并遍歷練習(xí)2(按照姓名的長度排序)
@Override //按照姓名長度排序 public int compareTo(Person o) { int length = this.name.length() - o.name.length(); //比較長度為主要條件 int num = length == 0 ? this.name.compareTo(o.name) : length; //比較內(nèi)容為次要條件 return num == 0 ? this.age - o.age : num; //比較年齡為次要條件 }14_TreeSet保證元素唯一和比較器排序的原理及代碼實(shí)現(xiàn)
A:案例演示
TreeSet保證元素唯一和比較器排序的原理及代碼實(shí)現(xiàn)
public static void main(String[] args) { //將字符串按照長度排序 //Comparator c = new CompareBylen();父類指向子類 TreeSetts = new TreeSet<>(new CompareByLen()); ts.add("aaaaa"); ts.add("z"); ts.add("wc"); ts.add("nab"); ts.add("cba"); System.out.println(ts); }
//比較器 class CompareByLen /*extends Object*/ implements Comparator15_TreeSet原理{ @Override public int compare(String s1, String s2) { //按照字符串長度比較 int num = s1.length() - s2.length(); //長度為主要條件 return num == 0 ? s1.compareTo(s2) : num;//內(nèi)容為次要條件 } }
1.特點(diǎn)
TreeSet是用來排序的, 可以指定一個順序, 對象存入之后會按照指定的順序排列
2.使用方式
a.自然順序(Comparable)
TreeSet類的add()方法中會把存入的對象提升為Comparable類型
調(diào)用對象的compareTo()方法和集合中的對象比較
根據(jù)compareTo()方法返回的結(jié)果進(jìn)行存儲
b.比較器順序(Comparator)
創(chuàng)建TreeSet的時(shí)候可以制定 一個Comparator
如果傳入了Comparator的子類對象, 那么TreeSet就會按照比較器中的順序排序
add()方法內(nèi)部會自動調(diào)用Comparator接口中compare()方法排序
調(diào)用的對象是compare方法的第一個參數(shù),集合中的對象是compare方法的第二個參數(shù)
c.兩種方式的區(qū)別
TreeSet構(gòu)造函數(shù)什么都不傳, 默認(rèn)按照類中Comparable的順序(沒有就報(bào)錯ClassCastException)
TreeSet如果傳入Comparator, 就優(yōu)先按照Comparator進(jìn)行排序
16_練習(xí):集合中有無序且重復(fù)的字符串,定義方法,讓其有序(字典順序)且不去重排列。
A:匿名內(nèi)部類
就是內(nèi)部類的簡化寫法。
B:前提:存在一個類或者接口
這里的類可以是具體類也可以是抽象類。
C:格式:
new 接口名(){重寫方法;}
D:本質(zhì)是什么呢?
是一個繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對象。
import java.util.List; import java.util.TreeSet; import java.util.ArrayList; import java.util.Comparator; public class Demo4 { public static void main(String[] args) { //1.定義一個List集合,并存儲重復(fù)的無序的字符串 ArrayList17_練習(xí)list = new ArrayList<>(); list.add("aaaa"); list.add("g"); list.add("bb"); list.add("all"); list.add("ccc"); list.add("idea"); list.add("bb"); list.add("aaaa"); sort(list); //2.定義方法對其排序保留重復(fù) System.out.println(list); //3.打印List集合 } private static void sort(List list) { //1.創(chuàng)建TreeSet集合對象,因?yàn)镾tring本身就具備比較功能,但是重復(fù)不會保留,所以我們用比較器 TreeSet ts = new TreeSet<>(new Comparator () { //匿名內(nèi)部類的方法 @Override public int compare(String s1, String s2) { int num = s1.compareTo(s2); //比較內(nèi)容 return num == 0 ? 1 : num; }}); //2.將List集合中所有的元素添加到TreeSet集合中,對其排序,保留重復(fù) ts.addAll(list); //3.清空list集合 list.clear(); //4.將TreeSet集合中排好序的元素添加到list中 list.addAll(ts); } }
從鍵盤接收一個字符串, 程序?qū)ζ渲兴凶址M(jìn)行排序,例如鍵盤輸入: helloworld程序打印:dehllloorw
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo5 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入一個字符串:"); String line = sc.nextLine(); //2.將字符串轉(zhuǎn)換為字符數(shù)組 char[] arr = line.toCharArray(); //3.定義TreeSet集合,傳入比較器對字符排序,并保留重復(fù) TreeSet18_練習(xí)ts = new TreeSet<>(new Comparator () { @Override public int compare(Character c1, Character c2) { // int num = c1 - c2; //自動拆箱 int num = c1.compareTo(c2); return num == 0 ? 1 : num; }}); //4.遍歷字符數(shù)組,將每一個字符存儲在TreeSet集合中 for (char c : arr) { ts.add(c); //自動裝箱 } //5.遍歷TreeSet打印每一個字符 for(Character c : ts) { System.out.print(c); } } }
程序啟動后, 可以從鍵盤輸入接收多個整數(shù), 直到輸入quit時(shí)結(jié)束輸入. 把所有輸入的整數(shù)倒序排列打印.
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo6 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //1.創(chuàng)建Scanner對象,鍵盤錄入。 //2.創(chuàng)建TreeSet集合對象,TreeSet傳入比較器。 TreeSet19_練習(xí)ts = new TreeSet<>(new Comparator () { //將比較器傳給TreeSet的構(gòu)造方法 @Override public int compare(Integer i1, Integer i2) { int num = i2 - i1; //自動拆箱 // int num = i2.csompareTo(i1); return num == 0 ? 1 : num; }}); System.out.println("請輸入一個整數(shù):"); //3.無限循環(huán)接收整數(shù),遇到Quit退出,用字符串的形式接收。 while(true) { String line = sc.nextLine();//將鍵盤錄入的字符串存儲在line中 if("quit".equals(line)) {//如果字符串常量和變量比較,常量放前面,這樣不會出現(xiàn)空指針異常,變量里面可能存儲null break; } //4.判斷quit就退出,不是就將其轉(zhuǎn)換為Integer,并添加到集合中 Integer i = Integer.parseInt(line);//將數(shù)字字符串轉(zhuǎn)換成數(shù)字 ts.add(i); } //5.遍歷TreeSet集合并打印每一個元素。 for (Integer integer : ts) { System.out.print(integer); } } }
需求:鍵盤錄入5個學(xué)生信息(姓名,語文成績,數(shù)學(xué)成績,英語成績),按照總分從高到低輸出到控制臺。
//1.定義一個學(xué)生類 //a.成員變量:姓名,語文成績,數(shù)學(xué)成績,英語成績,總成績 //b.成員方法:空參有參構(gòu)造,toString方法,在遍歷集合中的Student對象,打印對象引用的時(shí)候會顯示屬性值 public class Student { private String name; private int chinese; private int math; private int english; private int sum; public Student() { super(); } public Student(String name, int chinese, int math, int english) { super(); this.name = name; this.chinese = chinese; this.math = math; this.english = english; this.sum = this.chinese + this.math + this.english; } public int getSum() { return sum; } public String toString() { return name + "," + chinese + "," + math + "," + english + "," + sum; } }
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Demo7 { public static void main(String[] args) { //2.鍵盤錄入需要Scanner,創(chuàng)建鍵盤錄入對象 Scanner sc = new Scanner(System.in); System.out.println("請輸入一個學(xué)生成績:姓名,語文成績,數(shù)學(xué)成績,英語成績"); // 3.創(chuàng)建TreeSet集合對象,在TreeSet的構(gòu)造函數(shù)中傳入比較器,按照總分比較 TreeSet20_總結(jié)ts = new TreeSet<>(new Comparator () { @Override public int compare(Student s1, Student s2) { int num = s2.getSum() - s1.getSum(); return num == 0 ? 1 : num; }}); //4.錄入五個學(xué)生,以集合中的學(xué)生個數(shù)為判斷條件,如果size是小于5就進(jìn)行存儲 while(ts.size() < 5) { // 5.將錄入的字符串切割,用逗號切割,會返回一個字符串?dāng)?shù)組,將字符串?dāng)?shù)組中從第二個元素開始轉(zhuǎn)換成int數(shù) String line = sc.nextLine(); String[] arr = line.split(","); int chinese = Integer.parseInt(arr[1]); int math = Integer.parseInt(arr[2]); int english = Integer.parseInt(arr[3]); //6.將轉(zhuǎn)換后的結(jié)果封裝成Student對象,將Student添加到TreeSet集合中 ts.add(new Student(arr[0], chinese, math, english)); } //7.遍歷TreeSet集合打印每一個Student對象 System.out.println("排序后的學(xué)生信息:"); for (Student s : ts) { System.out.println(s); } } }
1.List
a.普通for循環(huán), 使用get(int index)逐個獲取 (Set沒有,因?yàn)闆]有索引)
b.調(diào)用iterator()方法得到Iterator, 使用hasNext()和next()方法
c.增強(qiáng)for循環(huán), 只要可以使用Iterator的類都可以用
d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
2.Set
a.調(diào)用iterator()方法得到Iterator, 使用hasNext()和next()方法
b.增強(qiáng)for循環(huán), 只要可以使用Iterator的類都可以用
3.普通for循環(huán),迭代器,增強(qiáng)for循環(huán)不能在遍歷的過程中刪除
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77216.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:中的集合稱為單列集合,中的集合稱為雙列集合。洗牌通過數(shù)字完成洗牌發(fā)牌發(fā)牌將每個人以及底牌設(shè)計(jì)為將最后張牌直接存放于底牌,剩余牌通過對取模依次發(fā)牌。存放的過程中要求數(shù)字大小與斗地主規(guī)則的大小對應(yīng)。 01Map集合概述 A:Map集合概述: 我們通過查看Map接口描述,發(fā)現(xiàn)Map接口下的集合與Collection接口下的集合,它們存儲數(shù)據(jù)的形式不同 ? a:Collection中的集...
摘要:使用默認(rèn)隨機(jī)源對指定列表進(jìn)行置換。將集合排序使用二分搜索法搜索指定列表,以獲得指定對象根據(jù)元素的自然順序,返回給定的最大元素。 1_Map集合概述和特點(diǎn) A:Map接口概述 查看API可以知道: 將鍵映射到值的對象 一個映射不能包含重復(fù)的鍵 每個鍵最多只能映射到一個值 B:Map接口和Collection接口的不同 Map是雙列的,Collection是單列的 Map...
集合接口 核心集合接口封裝了不同類型的集合,如下圖所示,這些接口允許獨(dú)立于其表示的細(xì)節(jié)來操縱集合,核心集合接口是Java集合框架的基礎(chǔ),如下圖所示,核心集合接口形成層次結(jié)構(gòu)。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類推,另請注意,層次結(jié)構(gòu)...
閱讀 1523·2023-04-26 02:03
閱讀 4707·2021-11-22 13:53
閱讀 4579·2021-09-09 11:40
閱讀 3782·2021-09-09 09:34
閱讀 2125·2019-08-30 13:18
閱讀 3501·2019-08-30 11:25
閱讀 3295·2019-08-26 14:06
閱讀 2545·2019-08-26 13:52