当前位置:   article > 正文

Set集合的实现类:TreeSet(自然排序和比较器排序)、HashSet(使用哈希表去除重复元素)_hash set去重排序

hash set去重排序

1. Set集合

Set集合是Collection单列集合的子接口,主要特点:

  • Set集合可以去除重复元素
  • Set集合的存入顺序和取出顺序不一致
  • Set集合没有索引,不能使用普通for循环遍历

 Set集合遍历:

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Set<String> set = new TreeSet<>();
  4. set.add("aaa");
  5. set.add("ddd");
  6. set.add("bbb");
  7. set.add("aaa");
  8. //迭代器遍历
  9. Iterator<String> it = set.iterator();
  10. while (it.hasNext()){
  11. String s = it.next();
  12. System.out.println(s);
  13. }
  14. System.out.println("*****************************");
  15. //增强for循环
  16. for (String s : set) {
  17. System.out.println(s);
  18. }
  19. }
  20. }

2. TreeSet集合

TreeSet集合是Set接口的实现类,主要特点:

  • TreeSet集合的底层数据结构是红黑树
  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环 
  • 可以将元素按照规则进行排序(自然排序和比较器排序

2.1 自然排序Comparable

  • 使用TreeSet集合存储学生对象并遍历,创建TreeSet集合使用无参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

实现步骤: 

  1. 使用空参构造创建TreeSet集合
  2. 自定义的Student类实现Comparable接口
  3. 重写接口中的compareTo方法
  1. public class Student implements Comparable<Student>{
  2. private String name;
  3. private int age;
  4. @Override
  5. public int compareTo(Student o) {
  6. //主要判断条件
  7. int result = this.age - o.age;
  8. //次要判断条件
  9. result = this.age == o.age ? this.name.compareTo(o.name) : result;
  10. return result;
  11. }
  12. @Override
  13. public String toString() {
  14. return "Student{" +
  15. "name='" + name + '\'' +
  16. ", age=" + age +
  17. '}';
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getAge() {
  26. return age;
  27. }
  28. public void setAge(int age) {
  29. this.age = age;
  30. }
  31. public Student(String name, int age) {
  32. this.name = name;
  33. this.age = age;
  34. }
  35. public Student() {
  36. }
  37. }
  1. import java.util.TreeSet;
  2. public class TreeSetDemo {
  3. public static void main(String[] args) {
  4. TreeSet<Student> students = new TreeSet<>();
  5. Student stu1 = new Student("zhangliang", 59);
  6. Student stu2 = new Student("likui", 43);
  7. Student stu3 = new Student("abc", 38);
  8. Student stu4 = new Student("acb", 38);
  9. Student stu5 = new Student("zhouyu", 26);
  10. students.add(stu1);
  11. students.add(stu2);
  12. students.add(stu3);
  13. students.add(stu4);
  14. students.add(stu5);
  15. System.out.println(students);
  16. }
  17. }

2.2 比较器排序Comparator

TreeSet集合的构造方法接收Comparator的实现类对象(匿名内部类),重写compare方法

案例需求:

  • 使用TreeSet集合存储老师对象并遍历,创建TreeSet集合使用带参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
  1. public class Teacher {
  2. private String name;
  3. private int age;
  4. @Override
  5. public String toString() {
  6. return "Teacher{" +
  7. "name='" + name + '\'' +
  8. ", age=" + age +
  9. '}';
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public Teacher(String name, int age) {
  24. this.name = name;
  25. this.age = age;
  26. }
  27. public Teacher() {
  28. }
  29. }
  1. import java.util.Comparator;
  2. import java.util.TreeSet;
  3. public class TreeSetDemo1 {
  4. public static void main(String[] args) {
  5. //使用匿名内部类创建Comparator实现类,重写compare方法
  6. TreeSet<Teacher> teachers= new TreeSet<>(new Comparator<Teacher>() {
  7. @Override
  8. public int compare(Teacher o1, Teacher o2) {
  9. int result = o1.getAge() - o2.getAge();
  10. result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
  11. return result;
  12. }
  13. });
  14. Teacher teacher1 = new Teacher("abc" , 26);
  15. Teacher teacher2 = new Teacher("acb" , 26);
  16. Teacher teacher3 = new Teacher("wangling" , 19);
  17. Teacher teacher4 = new Teacher("deshrng" , 56);
  18. Teacher teacher5 = new Teacher("hangjinh" , 36);
  19. teachers.add(teacher1);
  20. teachers.add(teacher2);
  21. teachers.add(teacher3);
  22. teachers.add(teacher4);
  23. teachers.add(teacher5);
  24. System.out.println(teachers);
  25. }
  26. }

2.3 自然排序和比较器排序比较

  • 自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
  • 比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
  • 在使用TreeSet集合的时候,首先考虑自然排序,当自然排序不满足所需要求时,则使用比较器排序

两种方式中关于返回值的规则:

  • 如果返回值为负数,表示当前存入的元素是较小值,存左边
  • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
  • 如果返回值为正数,表示当前存入的元素是较大值,存右边

3. HashSet集合

HashSet集合是Set接口的实现类,主要特点:

  • HashSet集合底层数据结构是哈希表
  • 数据的存取顺序无序
  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环遍历

 3.1 哈希表

 

哈希值:

  • 哈希值是根据对象的地址或者字符串或者数字算出来的int类型的数值
  • hashCode()是获取对象哈希值的方法,如果不重写hashCode()方法,默认使用对象地址值计算哈希值
  • 重写hashCode()方法后,不同属性值的对象可能会得到相同的哈希值

3.2 HashSet集合存储学生对象并遍历

学生类,重写hashCode和equals方法,去除重复学生对象:

  1. public class Student {
  2. private String name;
  3. private int age;
  4. public Student() {
  5. }
  6. public Student(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. @Override
  23. public boolean equals(Object o) {
  24. if (this == o) return true;
  25. if (o == null || getClass() != o.getClass()) return false;
  26. Student student = (Student) o;
  27. if (age != student.age) return false;
  28. return name != null ? name.equals(student.name) : student.name == null;
  29. }
  30. @Override
  31. public int hashCode() {
  32. int result = name != null ? name.hashCode() : 0;
  33. result = 31 * result + age;
  34. return result;
  35. }
  36. }

 测试类,将学生对象存入HashSet集合并遍历:

  1. public class HashSetDemo02 {
  2. public static void main(String[] args) {
  3. //创建HashSet集合对象
  4. HashSet<Student> hs = new HashSet<Student>();
  5. //创建学生对象
  6. Student s1 = new Student("林青霞", 30);
  7. Student s2 = new Student("张曼玉", 35);
  8. Student s3 = new Student("王祖贤", 33);
  9. Student s4 = new Student("王祖贤", 33);
  10. //把学生添加到集合
  11. hs.add(s1);
  12. hs.add(s2);
  13. hs.add(s3);
  14. hs.add(s4);
  15. //遍历集合(增强for)
  16. for (Student s : hs) {
  17. System.out.println(s.getName() + "," + s.getAge());
  18. }
  19. }
  20. }

 

如有错误欢迎留言评论,及时更正。2021年六月四日 羽露风

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/766133
推荐阅读
相关标签
  

闽ICP备14008679号