java~搞懂Comparable接口的compareTo方法

Posted 敢于对过去告一个段落,才有信心掀开新的篇章!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java~搞懂Comparable接口的compareTo方法相关的知识,希望对你有一定的参考价值。

Comparable 接口的 compareTo 方法的升序或降序取决于实现该接口的类的具体实现。按照惯例,compareTo 方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说:

  • 如果 this 对象小于传入的对象,则 compareTo 应该返回负数。
  • 如果 this 对象等于传入的对象,则 compareTo 应该返回零。
  • 如果 this 对象大于传入的对象,则 compareTo 应该返回正数。

通常情况下,这样的实现会使 compareTo 方法按照升序排序。但是,你也可以通过在返回语句中反转比较结果来实现降序排序。这完全取决于具体的实现。

单字段排序

下面是一个示例,演示了一个自定义类 Person 实现了 Comparable 接口,并使用 compareTo 方法按照年龄进行排序:

public class Person implements Comparable<Person> 
    private String name;
    private int age;

    // 构造函数、getter 和 setter 方法省略

    @Override
    public int compareTo(Person other) 
        // 按照年龄升序排序
        return this.age - other.age;
    

在这个示例中,compareTo 方法返回的结果是根据年龄比较的,如果调用 person1.compareTo(person2),返回的结果将是负数、零或正数,分别表示 person1 的年龄小于、等于或大于 person2 的年龄。

多字段排序

如果涉及到多个字段,比如一个学生类,它有成绩和年纪,先按成绩的降序排序,当成绩相同时,再按着年纪的升序排序,这就需要我们对两个字段进行判断了,如下

   @Override
   public int compareTo(Student o) 
   	if (this.score > o.score)
   		return -1;
   	else if (this.score < o.score)
   		return 1;
   	else 
   		return this.age-o.age;
   	
   

或者先判断是否不相同,这样两层if也可以了

	@Override
	public int compareTo(Student o) 
		if (this.score != o.score)
			return (int) (o.score - this.score);
		else
			return this.age - o.age;

	

总之,Comparable 接口的 compareTo 方法的升序或降序取决于具体的实现,你可以根据需要来决定返回的结果。

以上是关于java~搞懂Comparable接口的compareTo方法的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记13--比较器(ComparableComparator)

Java学习之Comparable与Comparator的区别

java学习-排序及加密签名时数据排序方式

Java中List的排序

一文真正搞懂Java中的自然排序和定制排序,到底升序还是降序

Java:Effective java学习笔记之 考虑实现Comparable 接口