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; } }