java比较类comparable和comparato的用法案例

java比较类comparable和comparato的用法 


*如果一个类的元素要想能够进行自然排序,

就必须实现自然排序接口Comparable,并实现

compareTo方法

 */

publicclass Student implements Comparable<Student> {

   private String name;

   privateint age;

 

   public Student() {

     super();

   }

 

   public Student(String name,int age) {

     super();

     this.name = name;

     this.age = age;

   }

 

   public String getName() {

     return name;

   }

 

   publicvoid setName(String name) {

     this.name = name;

   }

 

   publicint getAge() {

     return age;

   }

 

   publicvoid setAge(int age) {

     this.age = age;

   }

 

   @Override

   publicint compareTo(Student s) {

     // 主要条件姓名的长度

     int num =this.name.length() - s.name.length();

     // 姓名的长度相同,不代表姓名的内容相同

     int num2 = num == 0 ?this.name.compareTo(s.name) : num;

     // 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄

     int num3 = num2 == 0 ?this.age - s.age : num2;

     return num3;

   }

}

 

/*

 * 需求:请按照姓名的长度排序

 */

publicclass TreeSetDemo {

   publicstaticvoid main(String[]args) {

     // 创建集合对象

     TreeSet<Student>ts = new TreeSet<Student>();

 

     // 创建元素

     Student s1 = new Student("linqingxia", 27);

     Student s2 = new Student("zhangguorong", 29);

     Student s3 = new Student("wanglihong", 23);

     Student s4 = new Student("linqingxia", 27);

     Student s5 = new Student("liushishi", 22);

     Student s6 = new Student("wuqilong", 40);

     Student s7 = new Student("fengqingy", 22);

     Student s8 = new Student("linqingxia", 29);

 

     // 添加元素

     ts.add(s1);

     ts.add(s2);

     ts.add(s3);

     ts.add(s4);

     ts.add(s5);

     ts.add(s6);

     ts.add(s7);

     ts.add(s8);

 

     // 遍历

     for (Student s : ts) {

        System.out.println(s.getName()+"---" + s.getAge());

     }

   }

}

 


/*

 * 需求:请按照姓名的长度排序

 *

 * TreeSet集合保证元素排序和唯一性的原理

 * 唯一性:是根据比较的返回是否是0来决定。

 * 排序:

 *      A:自然排序(元素具备比较性)

 *       让元素所属的类实现自然排序接口 Comparable

 *      B:比较器排序(集合具备比较性)

 *       让集合的构造方法接收一个比较器接口的子类对象 Comparator

 */

publicclass TreeSetDemo {

   publicstaticvoid main(String[]args) {

     // 创建集合对象

      // TreeSet<Student> ts =new TreeSet<Student>(); //自然排序

     // public TreeSet(Comparator comparator) //比较器排序

     // TreeSet<Student> ts = new TreeSet<Student>(newMyComparator());

 

     // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象

     // 而匿名内部类就可以实现这个东西

     TreeSet<Student>ts = new TreeSet<Student>(new Comparator<Student>() {

        @Override

        publicint compare(Student s1, Student s2) {

          // 姓名长度

          int num = s1.getName().length() - s2.getName().length();

          // 姓名内容

          int num2 = num == 0 ? s1.getName().compareTo(s2.getName())

               : num;

          // 年龄

          int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;

          return num3;

        }

     });

 

     // 创建元素

     Student s1 = new Student("linqingxia", 27);

     Student s2 = new Student("zhangguorong", 29);

     Student s3 = new Student("wanglihong", 23);

     Student s4 = new Student("linqingxia", 27);

     Student s5 = new Student("liushishi", 22);

     Student s6 = new Student("wuqilong", 40);

     Student s7 = new Student("fengqingy", 22);

     Student s8 = new Student("linqingxia", 29);

 

     // 添加元素

     ts.add(s1);

     ts.add(s2);

     ts.add(s3);

     ts.add(s4);

     ts.add(s5);

     ts.add(s6);

     ts.add(s7);

     ts.add(s8);

 

     // 遍历

     for (Student s : ts) {

        System.out.println(s.getName()+"---" + s.getAge());

     }

   }

}




也可以在Collection的方法sort上定义排序方法

List<Student> list = new ArrayList<Student>();

 

     // 创建学生对象

     Student s1 = new Student("林青霞", 27);

     Student s2 = new Student("风清扬", 30);

     Student s3 = new Student("刘晓曲", 28);

     Student s4 = new Student("武鑫", 29);

     Student s5 = new Student("林青霞", 27);

 

     // 添加元素对象

     list.add(s1);

     list.add(s2);

     list.add(s3);

     list.add(s4);

     list.add(s5);

 


     // Collections.sort(list);  比较器排序

     // 如果同时有自然排序和比较器排序,以比较器排序为主

     Collections.sort(list, new Comparator<Student>() {

        @Override

        publicint compare(Student s1, Student s2) {

          int num = s2.getAge() - s1.getAge();

          int num2 = num == 0 ? s1.getName().compareTo(s2.getName())

               : num;

          return num2;

        }

     });


// 遍历集合

     for (Student s : list) {

        System.out.println(s.getName()+ "---" + s.getAge());

     }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值