A:Set集合概述及特色java
B:案例演示算法
import java.util.HashSet; public class Demo1_HashSet { public static void main(String[] args) { //Set集合,無索引,不能夠重複,無序(存取不一致) HashSet<String> hs = new HashSet<>(); //建立HashSet對象 boolean b1 = hs.add("a"); boolean b2 = hs.add("a"); //當向Set集合中儲存重複元素的時候返回爲false hs.add("b"); hs.add("c"); hs.add("d"); System.out.println(hs); //HashSet的繼承體現中有重寫toString方法 System.out.println(b1); System.out.println(b2); for (String string : hs) { //只要能用迭代器迭代的,就可使用加強for循環遍歷 System.out.println(string); } } }
A:案例演示數組
B:畫圖演示dom
C:代碼優化ide
最終版就是自動生成便可。函數
D:原理優化
1.HashSet原理ui
當HashSet調用add()方法存儲對象的時候, 先調用對象的hashCode()方法獲得一個哈希值(如同上火車先有票), 而後在集合中查找是否有哈希值相同的對象this
2.將自定義類的對象存入HashSet去重複idea
import java.util.HashSet; import net.allidea.bean.Person; public class Demo1_HashSet { public static void main(String[] args) { HashSet<Person> hs = 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.是質數。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) //調用的對象和傳入的對象是同一個對象 return true; if (obj == null) //傳入的對象爲NULL return false; if (getClass() != obj.getClass()) //判斷兩個對象對應的字節碼文件是不是同一個字節碼 return false; Person other = (Person) obj; //向下轉型 if (age != other.age) //調用對象的年齡不等於傳入對象的年齡 return false; if (name == null) { //調用對象的姓名爲null if (other.name != null) return false; } else if (!name.equals(other.name)) //調用對象的姓名不等於傳入對象的姓名 return false; return true; } /* @Override public boolean equals(Object obj) { System.out.println("執行了嗎"); 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; }*/ }
B:LinkedHashSet的特色
1.底層是鏈表實現的,是Set集合中惟一一個能保證怎麼存就怎麼取的集合對象
import java.util.LinkedHashSet; public class Demo2_LinkedHashSet { public static void main(String[] args) { LinkedHashSet<String> 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:案例演示
import java.util.HashSet; import java.util.Random; public class Demo3_test { public static void main(String[] args) { Random r = new Random(); //1.建立Random隨機數對象 HashSet<Integer> hs = new HashSet<>(); //2.須要存儲10個隨機數,不能重複,用HashSet集合 while(hs.size() < 10) { //3.若是HashSet的size<10就能夠不斷的存儲,若是>=10就中止存儲 hs.add(r.nextInt(20) + 1); //4.經過Random類中的nextInt(n)方法,獲取1-20之間的隨機數, } //並將這些隨機數存儲在HashSet集合中 for (Integer integer : hs) { //5.遍歷HashSet System.out.println(integer); } } }
import java.util.HashSet; import java.util.Scanner; public class Demo2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //1.建立Scanner對象 System.out.println("請輸入一行字符串:"); HashSet<Character> hs = new HashSet<>(); //2.建立HashSet對象,將字符存儲去掉重複 String line = sc.nextLine(); char[] arr = line.toCharArray(); //3.將字符串轉換爲字符數組,獲取每個字符存儲在HashSet集合中,自動去除重複 for (char c : arr) { //4.遍歷字符數組 hs.add(c); } for(Character ch : hs) { //5.自動拆箱,遍歷HashSet,打印每個字符 System.out.println(ch); } } }
import java.util.List; import java.util.ArrayList; import java.util.LinkedHashSet; public class Demo3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>();//1.建立List集合存儲若干個重複元素 list.add("a"); list.add("a"); list.add("b"); list.add("b"); list.add("b"); list.add("c"); getSingle(list); //2.單獨定義方法去除重複 System.out.println(list); //3.打印List集合 } public static void getSingle(List<String> list) { LinkedHashSet<String> lhs = new LinkedHashSet<>(); //1.建立一個LinkedHashSet集合 lhs.addAll(list); //2.將List集合中全部的元素添加到LinkedHashSet集合中,去重 list.clear(); //3.將List集合中的元素清空。 list.addAll(lhs); //4.將LinkedHashSet集合中的元素添加回List集合中 } }
A:案例演示
TreeSet存儲Integer類型的元素並遍歷
import java.util.TreeSet; public class Demo3_TreeSet { public static void main(String[] args) { TreeSet<Integer> ts = new TreeSet<>(); ts.add(1); ts.add(1); ts.add(3); ts.add(3); ts.add(2); System.out.println(ts); } }
A:案例演示
存儲自定義Person對象
B:TreeSet保證元素惟一和天然排序的原理和圖解
原理
import java.util.TreeSet; import net.allidea.bean.Person; public class Demo3_TreeSet { public static void main(String[] args) { TreeSet<Person> ts = 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<Integer> 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; }
A:案例演示
@Override //按照姓名排序 public int compareTo(Person o) { int num = this.name.compareTo(o.name); return num == 0 ? this.age - o.age : num; }
A:案例演示
@Override //按照姓名長度排序 public int compareTo(Person o) { int length = this.name.length() - o.name.length(); //比較長度爲主要條件 int num = length == 0 ? this.name.compareTo(o.name) : length; //比較內容爲次要條件 return num == 0 ? this.age - o.age : num; //比較年齡爲次要條件 }
A:案例演示
public static void main(String[] args) { //將字符串按照長度排序 //Comparator c = new CompareBylen();父類指向子類 TreeSet<String> ts = 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 Comparator<String> { @Override public int compare(String s1, String s2) { //按照字符串長度比較 int num = s1.length() - s2.length(); //長度爲主要條件 return num == 0 ? s1.compareTo(s2) : num;//內容爲次要條件 } }
1.特色
2.使用方式
a.天然順序(Comparable)
b.比較器順序(Comparator)
c.兩種方式的區別
A:匿名內部類
B:前提:存在一個類或者接口
C:格式:
new 接口名(){重寫方法;}
D:本質是什麼呢?
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集合,並存儲重複的無序的字符串 ArrayList<String> 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.定義方法對其排序保留重複 System.out.println(list); //3.打印List集合 } private static void sort(List<String> list) { //1.建立TreeSet集合對象,由於String自己就具有比較功能,可是重複不會保留,因此咱們用比較器 TreeSet<String> ts = new TreeSet<>(new Comparator<String>() { //匿名內部類的方法 @Override public int compare(String s1, String s2) { int num = s1.compareTo(s2); //比較內容 return num == 0 ? 1 : num; }}); //2.將List集合中全部的元素添加到TreeSet集合中,對其排序,保留重複 ts.addAll(list); //3.清空list集合 list.clear(); //4.將TreeSet集合中排好序的元素添加到list中 list.addAll(ts); } }
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.將字符串轉換爲字符數組 char[] arr = line.toCharArray(); //3.定義TreeSet集合,傳入比較器對字符排序,並保留重複 TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() { @Override public int compare(Character c1, Character c2) { // int num = c1 - c2; //自動拆箱 int num = c1.compareTo(c2); return num == 0 ? 1 : num; }}); //4.遍歷字符數組,將每個字符存儲在TreeSet集合中 for (char c : arr) { ts.add(c); //自動裝箱 } //5.遍歷TreeSet打印每個字符 for(Character c : ts) { System.out.print(c); } } }
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.建立Scanner對象,鍵盤錄入。 //2.建立TreeSet集合對象,TreeSet傳入比較器。 TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() { //將比較器傳給TreeSet的構造方法 @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("請輸入一個整數:"); //3.無限循環接收整數,遇到Quit退出,用字符串的形式接收。 while(true) { String line = sc.nextLine();//將鍵盤錄入的字符串存儲在line中 if("quit".equals(line)) {//若是字符串常量和變量比較,常量放前面,這樣不會出現空指針異常,變量裏面可能存儲null break; } //4.判斷quit就退出,不是就將其轉換爲Integer,並添加到集合中 Integer i = Integer.parseInt(line);//將數字字符串轉換成數字 ts.add(i); } //5.遍歷TreeSet集合並打印每個元素。 for (Integer integer : ts) { System.out.print(integer); } } }
//1.定義一個學生類 //a.成員變量:姓名,語文成績,數學成績,英語成績,總成績 //b.成員方法:空參有參構造,toString方法,在遍歷集合中的Student對象,打印對象引用的時候會顯示屬性值 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,建立鍵盤錄入對象 Scanner sc = new Scanner(System.in); System.out.println("請輸入一個學生成績:姓名,語文成績,數學成績,英語成績"); // 3.建立TreeSet集合對象,在TreeSet的構造函數中傳入比較器,按照總分比較 TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num = s2.getSum() - s1.getSum(); return num == 0 ? 1 : num; }}); //4.錄入五個學生,以集合中的學生個數爲判斷條件,若是size是小於5就進行存儲 while(ts.size() < 5) { // 5.將錄入的字符串切割,用逗號切割,會返回一個字符串數組,將字符串數組中從第二個元素開始轉換成int數 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.將轉換後的結果封裝成Student對象,將Student添加到TreeSet集合中 ts.add(new Student(arr[0], chinese, math, english)); } //7.遍歷TreeSet集合打印每個Student對象 System.out.println("排序後的學生信息:"); for (Student s : ts) { System.out.println(s); } } }
1.List
2.Set