Comparable接口的compareTo()方法

【代码】

 1 package com.hxl;
 2
 3 public class Student implements Comparable<Student> {
 4
 5     private String name;
 6     private int age;
 7
 8     public Student() {
 9         super();
10     }
11
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15         this.age = age;
16     }
17
18     public String getName() {
19         return name;
20     }
21
22     public void setName(String name) {
23         this.name = name;
24     }
25
26     public int getAge() {
27         return age;
28     }
29
30     public void setAge(int age) {
31         this.age = age;
32     }
33
34     @Override
35     public int compareTo(Student s) {
36         // 先让两个对象的age属性做差比较,这个是主要排序条件
37         int num = this.age - s.age;
38         // 若age属性相同,再比较name属性(String类本身实现了Comparable接口)
39         // 即在主要排序条件相同的情况下,次要排序条件起作用
40         int flag = num == 0 ? this.name.compareTo(s.name) : num;
41         // 返回比较结果
42         return flag;
43     }
44 }
 1 package com.hxl;
 2
 3 import java.util.TreeSet;
 4
 5 public class Test {
 6     public static void main(String[] args) {
 7         TreeSet<Student> ts = new TreeSet<Student>();
 8         ts.add(new Student("cc", 11));
 9         ts.add(new Student("ee", 11));
10         ts.add(new Student("cc", 22));
11         ts.add(new Student("aa", 22));
12         ts.add(new Student("bb", 11));
13
14         for (Student s : ts) {
15             System.out.println(s.getName()+"_"+s.getAge());
16         }
17
18         /*
19             为什么TreeSet集合中的元素既唯一又有序呢?
20             原因是它在存储元素的时候就是有序存储的(红黑树结构存储)
21             TreeSet的add()方法底层依赖的是Comparable的compareTo方法
22             这里就是说元素类本身要有自己的compareTo方法
23             所以元素类本身必须实现Comparable接口,重写compareTo方法
24             compareTo方法有个特点:它返回的是int型数据,结果有三类负数、0、正数
25             例如:(Java中一些常见的有比较意义的一些类都实现了Comparable接口,如Integer类)
26                 Integer a = new Integer(10);
27                 Integer b = new Integer(20);
28                 int num = a.compareTo(b);     //因为a小于b,所以num返回的是负数
29             而TreeSet的add()方法这样理解此返回值:
30             即返回负数则比根节点小,元素在此集合中唯一,元素存放根的左孩子
31             返回正数则比根节点大,元素在此集合中唯一,元素存放根的右孩子
32             返回0则表示,元素相同,在此集合中不唯一,故而丢掉不存放
33             由此可见,我们的重写的compareTo()方法决定了TreeSet集合中元素的去留和顺序!
34         */
35     }
36 }

原文地址:https://www.cnblogs.com/schiller-hu/p/8453039.html

时间: 2024-10-28 21:06:29

Comparable接口的compareTo()方法的相关文章

学习笔记--如何使用Comparable接口里compareTo 方法进行排序

接口 Comparable<T> 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法. 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序.实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器. 方法详细信息 compareTo int compareTo(T o) 比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别

Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set是并列的. Collections.sort() 排序方法,实现对List对象中的元素进行排序. package com.test.collection; import java.util.ArrayList; import java.util.Collections; import java.ut

Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个类大小的方法 shuffle(List); 随机排列 void reverse(List); 逆序排列(Linked效率较高) copy(); 复制集合, 前提是size()相同(长度, 和容量的区别) fill(List, Object);使用某个对象填充整个List binarySearch()

Effective Item - 谨慎实现Comparable接口

类实现了Comparable接口就表明类的实例本身具有内在的排序关系(natural ordering). 因此,该类可以与很多泛型算法和集合实现进行协作. 而我们之需要实现Comparable接口唯一的方法——compareTo. 以下是相关规则: sgn(x.compareTo(y)) = -sgn(y.compareTo(x)) (x.compareTo(y)>0 && y.compareTo(z)>0) 则 x.compareTo(z)>0 x.compareTo

第十二条:考虑实现Comparable接口

与前面讨论的方法不同,compareTo()方法并没有在Object类中定义.相反,它是Comparable接口中唯一的方法. 一个类的实例对象要想是可以比较大小的,那么这个类需要实现Comparable接口,必须正确的实现compareTo()方法. 一个类实现了Comparable接口,就表明这个类的实例对象具有内在的排序关系. 一旦类实现了Comparable接口,那么这个类就可以和依赖于该接口的集合实现进行协作,实现强大的功能. JDK中的所有值类,String类都已经实现了Compar

关于comparator接口和comparable接口以及它们各自的方法compare()和compareTo()

在今天做的LeetCode的题中有两道都出现了利用接口实现对象的排序,两题的相关链接: 1.利用comparable接口对对象排序 2.利用comparator接口实现排序 由于之前都没接触过这两个接口,一时不能明白它们的作用,所以在网上查找了很多资料,现在大致弄清楚一些,现在记录下来,有什么欠缺,欢迎大家及时指正 1.Comparable<T>接口 在java API文档中描述此接口是强行将实现它的每一个类的对象进行整体排序-----称为该类的自然排序,实现此接口的对象列表和数组可以用Col

Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法.....

编写一个Book类,该类至少有name和price两个属性.该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系.在主函数中,选择合适的集合类型存放Book类的若干个对象,然后创建一个新的Book类的对象,并检查该对象与集合中的哪些对象相等. package javajihe; public class Book implements Comparable{ String name; float price; B

TreeSet——实现Comparable接口并重写CompareTo()方法

TreeSet是以自然顺序存的数据,例如 Set<Student> students=new TreeSet(); students.add(new Student("111")); students.add(new Student("333")); students.add(new Student("222")); for (Student student : students) { System.out.println(stude

Comparable接口实现和使用方法介绍

1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 .实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序.实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器. 强烈推荐(虽然不是必需的)使自然排序与 equals 一致.所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且