HashSet
咱們通常使用HashSet來去重:java
HashSet去重的依據:面試
首先會比較hashCode(),若是不同則存進去,若是同樣的話,調用equals()方法進行比較,若是返回True就不存儲,false存儲數組
面試題:爲何自動生成hashCode的時候有個31的數?less
31是一個質數,質數是能被1和本身自己整除的數,沒有公約數
31剛恰好,既不大也不小
31這個數好算,2的五次方-1,至關於向左移5位-1
案例:產生10個1-20之間的隨機數要求隨機數不能重複dom
package l1; import java.util.HashSet; import java.util.Random; import java.util.Set; public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub Set<Integer> set = new HashSet<Integer>(); Random rd = new Random(); while(set.size()!=10){ int r = rd.nextInt(21); //生成1-20之間的隨機數 if(r!=0){ set.add(r); } } System.out.println(set); } }
案例:從鍵盤讀取一行輸入,去掉重複字符並打印ide
package l2; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Demo2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入一行內容"); String line = sc.nextLine(); //將字符串轉化爲字符數組 char[] ch = line.toCharArray(); Set<Character> set = new HashSet<Character>(); for(char a:ch){ set.add(a); } System.out.println(set); } }
案例:使用HashSet()過濾List集合中的重複的元素函數
package l3; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Demo3 { public static void main(String[] args) { List<String> li = new ArrayList<String>(); li.add("A"); li.add("B"); li.add("A"); li.add("A"); Set<String> set = new HashSet<String>(); set.addAll(li); System.out.println(set); } }
使用TreeSet 存儲自定義對象:ui
注意:使用TreeSet存儲自定義對象是會出現異常:xxxx cannot be cast to java.lang.Comparablethis
package lesson0001; import java.util.Set; import java.util.TreeSet; public class Demo1 { public static void main(String[] args) { Set<Student> set = new TreeSet<Student>(); set.add(new Student(1,"n1")); set.add(new Student(2,"n2")); set.add(new Student(3,"n3")); for(Student std:set){ System.out.println(std); } } } class Student implements Comparable{ private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } public Student() { super(); // TODO Auto-generated constructor stub } public Student(int age, String name) { super(); this.age = age; this.name = name; } @Override public int compareTo(Object arg0) { return 1; } }
以上是最簡單的一個例子,而後呢,咱們如今須要實現:spa
TreeSet存儲自定義對象而且遍歷,並且要按照姓名長度,字母,年齡順序排序
package lesson0002; import java.util.Set; import java.util.TreeSet; public class Demo1 { public static void main(String[] args) { Set<Student> set = new TreeSet<Student>(); set.add(new Student(1,"aaaa")); set.add(new Student(5,"aaaa")); set.add(new Student(2,"aaaa")); set.add(new Student(1,"aaa")); set.add(new Student(1,"aa")); for(Student std:set){ System.out.println(std); } } }
package lesson0002; public class Student implements Comparable<Student> { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student(int age, String name) { super(); this.age = age; this.name = name; } public Student() { super(); // TODO Auto-generated constructor stub } @Override public int compareTo(Student 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; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } }
package lesson0003; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; //比較器排序 public class Demo1 { public static void main(String[] args) { Set<String> set = new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { int num = o1.compareTo(o2);//默認的從小到大 num = num==0?1:num; //若是相同返回1,即保存同名的元素 return num; } }); set.add("aaa"); set.add("bbb"); set.add("ccc"); set.add("aaa"); set.add("aa"); for(String s:set){ System.out.println(s); } } }
TreeSet是用來排序的,能夠指定一個順序,對象存入以後會按照指定的順序排序
TreeSet的排序方式有兩種:
天然順序:
比較器順序:
天然排序和比較器排序的區別:
練習題案例:
1.在一個集合中存儲了無序而且重複的字符串,讓其有序,並且不能去除重複
我上面例子中,比較器排序的那個例子就是
2.從鍵盤輸入多個整數,直到輸入quit時結束輸入。把全部輸入的整數倒敘排列打印
package lesson0004; import java.util.Comparator; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Demo01 { public static void main(String[] args) { Set<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return (o2-o1)==0?1:(o2-o1); // return o2-o1; } }); Scanner sc = new Scanner(System.in); while(true){ String str = sc.nextLine(); if("quit".equals(str)){ break; }else{ set.add(Integer.parseInt(str)); } } for(Integer i:set){ System.out.println(i); } } }
3.鍵盤錄入學生信息按照總分排序後輸出在控制檯
package lesson0005; import java.util.Comparator; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub Set<Student> set = new TreeSet<Student>(); Scanner sc = new Scanner(System.in); while(true){ System.out.println("請按照格式輸入學生信息(學生名:年齡:成績)"); String line = sc.nextLine(); if("quit".equals(line)){ break; }else{ String name = line.split(":")[0]; int age = Integer.parseInt(line.split(":")[1]); int score = Integer.parseInt(line.split(":")[2]); set.add(new Student(name,age,score)); } } for(Student std:set){ System.out.println(std); } } }
package lesson0005; public class Student implements Comparable<Student> { private String name; private int age; private int score; 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; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", score=" + score + "]"; } public Student() { super(); } public Student(String name, int age, int score) { super(); this.name = name; this.age = age; this.score = score; } @Override public int compareTo(Student o) { int num = o.score - this.score; num = num==0?this.name.compareTo(o.name):num; num = num==0?(this.age-o.age):num; return num==0?1:num; } }