ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaSE-15.2.2【自然排序Comparable的使用】

2021-06-01 13:35:20  阅读:344  来源: 互联网

标签:Comparable 23 age 15.2 ts add Student JavaSE


  1 package day6.lesson2;
  2 
  3 import java.util.TreeSet;
  4 
  5 /*
  6 2.2 自然排序Comparable的使用
  7 
  8     案例:
  9         存储学生对象并遍历,创建TreeSet集合使用无参构造方法
 10     要求:
 11         按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
 12     实现:
 13         用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
 14         自然排序,就是让元素所属的类实现Comparable接口,重写compareTo()方法
 15         重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
 16  */
 17 public class TreeSetDemo2 {
 18     public static void main(String[] args) {
 19         TreeSet<Student> ts = new TreeSet<>();
 20 
 21         Student s1 = new Student("lisi", 22);
 22         Student s2 = new Student("wang", 25);
 23         Student s3 = new Student("sun", 23);
 24         Student s4 = new Student("sun", 23);
 25         Student s5 = new Student("amy", 23);
 26 
 27         //Student类实现Comparable接口前:
 28         /*//day6.lesson2.Student cannot be cast to java.lang.Comparable
 29         ts.add(s1); //类转换异常
 30         ts.add(s2);
 31         ts.add(s3);
 32         ts.add(s4);
 33         ts.add(s5);
 34         //Comparable接口对实现它的类的对象强加一个整体排序,称为类的自然排序,类的compareTo()称为其自然比较方法
 35         //为啥报异常?因为Student未实现Comparable接口*/
 36 
 37         //Student类实现Comparable接口后:
 38         /*ts.add(s1); //ok但不完全ok
 39         ts.add(s2);
 40         ts.add(s3);
 41         ts.add(s4);
 42         ts.add(s5);
 43         //lisi,22
 44         //为啥ts只存储了第一个元素呢?
 45         //因为Student类未重写Comparable接口的compareTo()
 46         //而compareTo()默认return0,意思是比较相等元素重复
 47         //所以只添加了第一个元素,后边的都认为与第一个相同*/
 48 
 49         //Student类重写compareTo()后:
 50         ts.add(s1); //ok
 51         ts.add(s2);
 52         ts.add(s3);
 53         ts.add(s4);
 54         ts.add(s5);
 55 
 56         /*
 57         return 1; //升序
 58         lisi,22
 59         wang,25
 60         sun,23
 61         sun,23
 62          */
 63 
 64         /*
 65         return -1; //降序
 66         sun,23
 67         sun,23
 68         wang,25
 69         lisi,22
 70          */
 71 
 72         /*
 73         自定义:按照年龄升序
 74         lisi,22
 75         sun,23
 76         wang,25
 77          */
 78 
 79         //注意,s4年龄同s3年龄,返回0,故s4未存入
 80 
 81         /*
 82         自定义:按照年龄降序
 83         wang,25
 84         sun,23
 85         lisi,22
 86          */
 87 
 88         /*
 89         自定义:先年龄升序,年龄相同时按照姓名的字母顺序排序
 90         lisi,22
 91         amy,23
 92         sun,23
 93         wang,25
 94          */
 95 
 96         for(Student s: ts){
 97             System.out.println(s.getName() + "," + s.getAge());
 98         }
 99     }
100 }
 1 package day6.lesson2;
 2 
 3 public class Student implements Comparable<Student>{
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Student() {
 9     }
10 
11     public Student(String name, int age) {
12         this.name = name;
13         this.age = age;
14     }
15 
16     public void setName(String name) {
17         this.name = name;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public int getAge() {
29         return age;
30     }
31 
32     @Override
33     public int compareTo(Student s) {
34 //        return 0; //默认 (说明比较相等,则元素重复)
35 
36         //重写
37 //        return 1; //升序
38 //        return -1; //降序
39 
40         //自定义:按照年龄升序
41         /*int num = this.age - s.age; //this-->s2  s-->s1
42         return num;*/
43 
44         //自定义:按照年龄降序
45         /*int num = s.age - this.age;
46         return num;*/
47 
48         //自定义:先年龄升序,年龄相同时按照姓名的字母顺序排序
49         int num = this.age - s.age;
50         int num2 = ( num == 0 ? this.name.compareTo(s.name) : num );
51         //String类也实现了Comparable接口,所以其内部已重写compareTo(),可直接调用
52         return num2;
53     }
54 
55 }

 

标签:Comparable,23,age,15.2,ts,add,Student,JavaSE
来源: https://www.cnblogs.com/yppah/p/14836794.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有