📜  如何覆盖Java的compareTo 方法?

📅  最后修改于: 2021-10-28 02:51:12             🧑  作者: Mango

众所周知, Java中基本上有两种排序技术:

  • 首先是内部排序,即使用预定义的排序方法升序排列Arrays.sort()用于原始类数组和包装类数组,而Collections.sort()用于集合,这两种方法都按升序对元素进行排序。
  • 第二种技术是使用类中的比较器或可比较接口对元素进行排序。
    • 比较器接口:在类中实现比较器接口并覆盖 compare() 方法或将新的比较器作为排序方法中的第二个参数传递,并根据需要更改排序顺序。 Comparator 仅适用于包装类型数组和像 vector、ArrayList 等的集合。
    • Comparable Interface:这个接口实现了单一的排序技术,它影响整个类。可比较的接口提供了一个 compareTo() 方法来对元素进行排序。

总而言之,在Java,如果对象的排序需要基于自然顺序,那么使用 Comparable 接口的 compareTo() 方法。对于整数,默认的自然排序顺序是升序,而对于字符串,它是按字母顺序排列的。然而,如果您需要对不同对象的属性进行排序,或者自定义排序,则使用 Comparator 接口的 compare()。

覆盖compareTo() 方法

为了首先根据操作的需要改变对象的排序,我们必须在类中实现一个 Comparable 接口并覆盖 compareTo() 方法。由于我们必须对对象数组进行排序,传统的array.sort()方法将不起作用,因为它曾经对原始类型起作用,所以当我们调用Arrays.sort()方法并传递对象数组时,它会搜索,无论我们是否覆盖了 compareTo() 方法。由于我们已经覆盖了 compareTo() 方法,因此将使用这个 compareTo() 方法根据年龄比较对象。

Java
// Java Program to show how to override the compareTo()
// method of comparable interface
import java.util.*;
 
// implementing Comparable interface
public class GFG implements Comparable {
 
    String name;
    int age;
 
    // Class constructor
    GFG(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
    public int getage() { return age; }
    public String getname() { return name; }
    public static void main(String[] args)
    {
        // Creating GFG class object
        GFG ob[] = new GFG[4];
 
        // Inserting elements in the objects
        ob[0] = new GFG("Aayush", 14);
        ob[1] = new GFG("Ravi", 12);
        ob[2] = new GFG("Sachin", 19);
        ob[3] = new GFG("Mohit", 20);
 
        // sort the array,using overriden method
        Arrays.sort(ob);
 
        for (GFG o : ob) {
 
            // printing the sorted array objects name and
            // age
            System.out.println(o.name + " " + o.age);
        }
 
        // if you want to create a dynamic array ,then you
        // can create an arraylist
        ArrayList objects = new ArrayList<>();
 
        // creating a new GFG object
        GFG newObject1 = new GFG("Rohan Devaki", 20);
 
        // inserting the new object into the arraylist
        objects.add(newObject1);
 
        // creating a new GFG object
        GFG newObject2 = new GFG("Algorithammer", 22);
 
        // inserting the new object into the arraylist
        objects.add(newObject2);
 
        // using Collections to sort the arraylist
        Collections.sort(objects);
 
        for (GFG o : objects) {
            // printing the sorted objects in arraylist by
            // name and age
            System.out.format("%s  %d\n", o.name, o.age);
        }
    }
    // Overriding compareTo() method
    @Override public int compareTo(GFG o)
    {
        if (this.age > o.age) {
 
            // if current object is greater,then return 1
            return 1;
        }
        else if (this.age < o.age) {
 
            // if current object is greater,then return -1
            return -1;
        }
        else {
 
            // if current object is equal to o,then return 0
            return 0;
        }
    }
}


输出
Ravi 12
Aayush 14
Sachin 19
Mohit 20
Rohan Devaki  20
Algorithammer  22