• day057:Set集合、TreeSet集合、自然排序Comparable的使用


    目录

    一、Set集合

    1.Set集合有两个实现类:TreeSet与HashSet

    2.Set集合的特点:

    二、TreeSet集合

    1.TreeSet集合的特点:

    2.自然排序Comparable使用的三个步骤:

    3.TreeSet——比较器排序


    一、Set集合

    1.Set集合有两个实现类:TreeSet与HashSet

    2.Set集合的特点:

    • 自动去除集合内重复的元素
    • 存取元素的顺序是不一致的
    • Set集合没有带索引的方法,所以不能使用普通for循环遍历,也不能利用索引去获取、删除元素(可使用增强for循环、迭代器来遍历Set集合)

    代码示例:

    1. /*Set集合的特点:
    2. * 1.可以去除重复的元素
    3. * 2.存取元素的顺序是不一致的
    4. * 3.set集合没有带索引的方法,所以不能使用普通for循环遍历、也不能通过索引获取、删除元素*/
    5. public class SetDemo_01 {
    6. public static void main(String[] args) {
    7. Set set = new TreeSet<>();
    8. set.add("ccc");
    9. set.add("aaa");
    10. set.add("bbb");
    11. set.add("aaa");//存重复的元素,set集合会自动去重
    12. //增强for循环遍历
    13. for (String s1 : set) {
    14. System.out.println(s1);
    15. }
    16. System.out.println("------------------------------------");
    17. //迭代器循环遍历
    18. Iterator it = set.iterator();
    19. while (it.hasNext()) {
    20. String s2 = it.next();
    21. System.out.println(s2);
    22. }
    23. }
    24. }

    二、TreeSet集合(无参用自然排序、implements;带参用比较器排序、匿名内部类)

    1.TreeSet集合的特点:

    • 去除集合内重复的元素
    • 没有带索引的方法
    • 可以将元素按照规则进行排序

    因此想要使用TreeSet集合,需要先制定排序规则。这里要说到自然排序Comparable的使用:

    2.自然排序Comparable使用的三个步骤:

    1. 需要使用空参构造创建一个TreeSet集合
    2. 自定义的类要实现Comparable接口(这个接口需要泛型,泛型要和集合里面数据的类型保持一致)
    3. 重写里面的compareTo方法

    代码示例:
     

    1. public class TreeSetDemo_02 {
    2. public static void main(String[] args) {
    3. TreeSet ts = new TreeSet<>();
    4. Student s1=new Student("ZhangSan",20);
    5. Student s2=new Student("LiSi",23);
    6. Student s3=new Student("WangEr",19);
    7. Student s4=new Student("ZhaoLiu",19);
    8. ts.add(s1);
    9. ts.add(s2);
    10. ts.add(s3);
    11. ts.add(s4);
    12. System.out.println(ts);
    13. }
    14. }

    1. /*自定义类要实现Comparable接口,并且这个接口的泛型,与TreeSet集合里的数据类型一致*/
    2. public class Student implements Comparable {
    3. private String name;
    4. public int age;
    5. public Student() {
    6. }
    7. public Student(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    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. @Override
    24. public String toString() {
    25. return "Student{" +
    26. "name='" + name + '\'' +
    27. ", age=" + age +
    28. '}';
    29. }
    30. @Override
    31. public int compareTo(Student o) {
    32. /* 自然排序的原理:
    33. 如果返回值是负数,表示当前存入的元素是较小值,存左边
    34. 如果返回值是0,表示当前存入的元素在TreeSet集合中已经存在,重复元素,不存
    35. 如果返回值是正数,表示当前存入的元素是较大值,存右边
    36. */
    37. //表示按照对象的年龄进行排序
    38. int result = this.age - o.age;//this.age代表当前正要存入的元素年龄,o.age代表已经存入进去的元素年龄,二者相减,再看返回值是正、0、还是为负
    39. result = result == 0 ? this.name.compareTo(o.getName()) : result;/*当年龄一样的时候,用姓名的首字母去排序;
    40. 注:this.name.compareTo中的compareTo方法是String类里的,
    41. 因为this.name是String类型的。*/
    42. return result;
    43. }
    44. }

    3.TreeSet——比较器Comparator排序

    比较器Comparator排序的使用步骤:

    1.  TreeSet的带参构造方法是使用比较器进行排序的
    2. 比较器排序,就是让集合构造方法接收Comparator的实现对象,重写compare( T o1,T o2)方法
    3. 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

    代码示例:

    1. public class TreeSetDemo_03 {
    2. public static void main(String[] args) {
    3. //使用匿名内部类进行排列
    4. TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
    5. @Override
    6. public int compare(Teacher o1, Teacher o2) {
    7. //o1代表的是要存入的元素
    8. //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 s1 = new Teacher("ZhangSan", 20);
    15. Teacher s2 = new Teacher("LiSi", 23);
    16. Teacher s3 = new Teacher("WangEr", 19);
    17. Teacher s4 = new Teacher("ZhaoLiu", 19);
    18. ts.add(s1);
    19. ts.add(s2);
    20. ts.add(s3);
    21. ts.add(s4);
    22. System.out.println(ts);
    23. }
    24. }
    1. public class Teacher {
    2. private String name;
    3. private int age;
    4. public Teacher() {
    5. }
    6. public Teacher(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 String toString() {
    24. return "Teacher{" +
    25. "name='" + name + '\'' +
    26. ", age=" + age +
    27. '}';
    28. }
    29. }

  • 相关阅读:
    【SOLIDWORKS学习笔记】制作小风扇摇头底座(上)--- 整体结构设计
    MQTT协议基本流程、原理
    tauri为窗口添加阴影效果
    ASA搜索展示的关键性因素以及优缺点
    浅谈Python中列表元素的修改以及列表的统计与排序
    mac环境使用pkgbuild命令打pkg包的几个小细节
    Tomcat部署
    如何使用virtualenv的虚拟环境
    git学习
    Speech | 语音中的风格迁移论文及总结[20231023更新版]
  • 原文地址:https://blog.csdn.net/m0_57466457/article/details/127104559