• 【Java基础】TreeSet集合、自然排序、比较器排序、成绩排序及不重复随机数案例


    目录

    一、TreeSet集合概述和特点

    二、自然排序Comparable的使用

    三、比较器排序Comparator的使用

    四、成绩排序案例

    五、不重复的随机数案例


    一、TreeSet集合概述和特点

    TreeSet集合概述:

    元素有序,可以按照一定的规则进行排序,具体排序方式取决于构造方法

    ■ TreeSet():根据其元素的自然排序进行排序

    ■ TreeSet(Comparator comparator):根据指定的比较器进行排序

    没有带索引的方法,所以不能使用普通for循环遍历

    由于是Set集合,所以不包括重复元素的集合

    TreeSet集合基本使用

    1. public class TreeSetDemo01 {
    2. public static void main(String[] args) {
    3. //创建集合对象
    4. TreeSet ts = new TreeSet();
    5. //添加元素
    6. ts.add(10);
    7. ts.add(40);
    8. ts.add(30);
    9. ts.add(50);
    10. ts.add(20);
    11. ts.add(30);
    12. //遍历集合
    13. for(Integer i : ts) {
    14. System.out.println(i);
    15. }
    16. }
    17. }

    二、自然排序Comparable的使用

    需求:

    存储学生对象并遍历,创建TreeSet集合使用无参构造方法

    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

    实现步骤:

    ● 用TreeSet存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的

    ● 自然排序,就是让元素多属的类实现Comparable接口,重写compareTo(T o)方法

    ● 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

    代码实现:

    学生类

    1. public class Student implements Comparable {
    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 int compareTo(Student s) {
    24. // return 0;
    25. // return 1;
    26. // return -1;
    27. //按照年龄从小到大排序
    28. int num = this.age - s.age;
    29. // int num = s.age - this.age;
    30. //年龄相同时,按照姓名的字母顺序排序
    31. int num2 = num == 0 ? this.name.compareTo(s.name) : num;
    32. return num2;
    33. }
    34. }

    测试类:

    1. public class TreeSetDemo02 {
    2. public static void main(String[] args) {
    3. //创建集合对象
    4. TreeSet ts = new TreeSet();
    5. //创建学生对象
    6. Student s1 = new Student("xishi", 29);
    7. Student s2 = new Student("wangzhaojun", 28);
    8. Student s3 = new Student("diaochan", 30);
    9. Student s4 = new Student("yangyuhuan", 33);
    10. Student s5 = new Student("linqingxia", 33);
    11. Student s6 = new Student("linqingxia", 33);
    12. //把学生添加到集合
    13. ts.add(s1);
    14. ts.add(s2);
    15. ts.add(s3);
    16. ts.add(s4);
    17. ts.add(s5);
    18. ts.add(s6);
    19. //遍历集合
    20. for (Student s : ts) {
    21. System.out.println(s.getName() + "," + s.getAge());
    22. }
    23. }
    24. }

    三、比较器排序Comparator的使用

    需求:

    存储学生对象并遍历,创建TreeSet集合使用带参构造方法

    要求:按照年龄从小到大的排序,年龄相同时,按照姓名的字母顺序排序

    实现步骤:

    ● 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的

    ● 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法

    ● 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

    代码实现:

    学生类

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

    测试类

    1. public class TreeSetDemo {
    2. public static void main(String[] args) {
    3. //创建集合对象
    4. TreeSet ts = new TreeSet(new Comparator() {
    5. @Override
    6. public int compare(Student s1, Student s2) {
    7. //this.age - s.age
    8. //s1,s2
    9. int num = s1.getAge() - s2.getAge();
    10. int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
    11. return num2;
    12. }
    13. });
    14. //创建学生对象
    15. Student s1 = new Student("xishi", 29);
    16. Student s2 = new Student("wangzhaojun", 28);
    17. Student s3 = new Student("diaochan", 30);
    18. Student s4 = new Student("yangyuhuan", 33);
    19. Student s5 = new Student("linqingxia", 33);
    20. Student s6 = new Student("linqingxia", 33);
    21. //把学生添加到集合
    22. ts.add(s1);
    23. ts.add(s2);
    24. ts.add(s3);
    25. ts.add(s4);
    26. ts.add(s5);
    27. ts.add(s6);
    28. //遍历集合
    29. for (Student s : ts) {
    30. System.out.println(s.getName() + "," + s.getAge());
    31. }
    32. }
    33. }

    四、成绩排序案例

    需求:

    用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合

    要求:按照总分从高到低出现

    代码实现:

    学生类

    1. public class Student {
    2. private String name;
    3. private int chinese;
    4. private int math;
    5. public Student() {
    6. }
    7. public Student(String name, int chinese, int math) {
    8. this.name = name;
    9. this.chinese = chinese;
    10. this.math = math;
    11. }
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. public int getChinese() {
    19. return chinese;
    20. }
    21. public void setChinese(int chinese) {
    22. this.chinese = chinese;
    23. }
    24. public int getMath() {
    25. return math;
    26. }
    27. public void setMath(int math) {
    28. this.math = math;
    29. }
    30. public int getSum() {
    31. return this.chinese + this.math;
    32. }
    33. }

    测试类:

    1. public class TreeSetDemo {
    2. public static void main(String[] args) {
    3. //创建TreeSet集合对象,通过比较器排序进行排序
    4. TreeSet ts = new TreeSet(new Comparator() {
    5. @Override
    6. public int compare(Student s1, Student s2) {
    7. // int num = (s2.getChinese()+s2.getMath())- (s1.getChinese() + s1.getMath());
    8. //主要条件
    9. int num = s2.getSum() - s1.getSum();
    10. //次要条件
    11. int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
    12. int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2;
    13. return num3;
    14. }
    15. });
    16. //创建学生对象
    17. Student s1 = new Student("林青霞", 98, 100);
    18. Student s2 = new Student("张曼玉", 95, 95);
    19. Student s3 = new Student("王祖贤", 100, 93);
    20. Student s4 = new Student("柳岩", 100, 97);
    21. Student s5 = new Student("风清扬", 98, 98);
    22. Student s6 = new Student("左冷禅", 97, 99);
    23. Student s7 = new Student("赵云", 97, 99);
    24. //把学生对象添加到集合
    25. ts.add(s1);
    26. ts.add(s2);
    27. ts.add(s3);
    28. ts.add(s4);
    29. ts.add(s5);
    30. ts.add(s6);
    31. ts.add(s7);
    32. //遍历集合
    33. for (Student s : ts) {
    34. System.out.println(s.getName() + "," + s.getChinese() + "," +
    35. s.getMath() + "," + s.getSum());
    36. }
    37. }
    38. }

    五、不重复的随机数案例

    需求:编写一个程序,获取10个1-20之间的随机数,要求随机数不能重复,并在控制台输出

    代码实现:

    1. public class SetDemo {
    2. public static void main(String[] args) {
    3. //创建Set集合对象
    4. // Set set = new HashSet();
    5. Set set = new TreeSet();
    6. //创建随机数对象
    7. Random r = new Random();
    8. //判断集合的长度是不是小于10
    9. while (set.size()<10) {
    10. //产生一个随机数,添加到集合
    11. int number = r.nextInt(20) + 1;
    12. set.add(number);
    13. }
    14. //遍历集合
    15. for(Integer i : set) {
    16. System.out.println(i);
    17. }
    18. }
    19. }

     

  • 相关阅读:
    Go语言进阶,闭包、指针、并发
    iOS 组件化-发布组件到远程仓库
    【容器】docker基础使用
    RHCE(五)HTTP、SSL协议综合实验
    虚拟DOM
    基于System-Verilog的VGA彩条设计与仿真
    事件绑定方式总结
    shell_53.理解Linux输入和输出
    【毕业设计】基于javaEE+SSH+SqlServer的企业车辆管理系统设计与实现(毕业论文+程序源码)——车辆管理系统
    Java架构师数据库设计
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/126793807