重写 Java 中的 CompareTo 方法

Mohammad Irfan 2023年10月12日
重写 Java 中的 CompareTo 方法

compareTo() 方法属于 Java 中的 Comparable 接口。它用于比较两个对象。

它将此对象与指定的对象进行比较以进行排序。如果此对象小于指定对象,则返回负整数,如果此对象等于指定对象,则返回零,如果此对象大于指定对象,则返回正整数。

虽然,Java 提供了几种其他方法来对值进行排序,例如:

  • Arrays.sort() 方法按升序对数组的元素进行排序。

  • Arrays.sort() 方法类似的 Collections.sort() 方法。我们可以使用这种方法对数组、队列链表等进行排序。

  • 比较器接口用于根据自定义顺序排序对对象的数组或列表进行排序。例如,对于学生对象的列表,自然顺序可以按学生的入学号码排序。

    尽管如此,在现实生活中的应用程序中,我们可能希望按学生的姓氏名字出生日期或任何其他此类标准对学生列表进行排序。在这种情况下,我们使用比较器接口。

  • Comparable 接口用于对用户定义类对象进行排序。

    可比较接口仅提供单个排序序列,即我们只能基于单个数据基础对元素进行排序。例如,它可能是年龄卷号姓名或其他任何东西。

总而言之,如果我们想根据自然顺序对对象进行排序,我们使用可比较接口的 compareTo() 方法。

然而,如果我们想根据不同对象的属性对对象进行排序或自定义排序,我们使用 Comparator 接口的 compare()

重写 Java 中的 compareTo() 方法

要根据操作需要对对象进行排序或比较,我们首先需要在类中实现 Comparable 接口,然后重写 compareTo() 方法。

由于我们必须对对象数组进行排序,传统的 array.sort() 方法将不起作用,因此我们调用 Arrays.sort() 方法并传递对象数组。

它将搜索我们是否重写了 compareTo() 方法。由于我们已经重写了 compareTo(),所以对象将根据年龄使用这个 compareTo() 方法进行比较。

package javaexample;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class SimpleTesting implements Comparable<SimpleTesting> {
  String name;
  int age;
  // Creating constructor
  SimpleTesting(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 OverrideCompareto class object
    SimpleTesting ob[] = new SimpleTesting[4];

    // Inserting elements in the objects
    ob[0] = new SimpleTesting("Virat", 71);
    ob[1] = new SimpleTesting("Rohit", 20);
    ob[2] = new SimpleTesting("Dhoni", 11);
    ob[3] = new SimpleTesting("Jadeja", 18);

    // sorting the array,using overriden method
    Arrays.sort(ob);

    for (SimpleTesting o : ob) {
      // printing the sorted array objects name and age
      System.out.println(o.name + " " + o.age);
    }

    // Creating a dynamic array by using an ArrayList
    ArrayList<SimpleTesting> objects = new ArrayList<>();

    // creating a new OverrideComparreto object
    SimpleTesting newObject1 = new SimpleTesting("Shardul Thakur", 20);

    objects.add(newObject1);

    // creating a new GFG object
    SimpleTesting newObject2 = new SimpleTesting("Jasprit Bumrah", 22);

    // inserting the new object into the arraylist
    objects.add(newObject2);

    // using Collections to sort the arraylist
    Collections.sort(objects);

    for (SimpleTesting o : objects) {
      // printing the sorted objects in arraylist by name and age
      System.out.println(o.name + "" + o.age);
    }
  }

  // Overriding compareTo() method
  @Override
  public int compareTo(SimpleTesting o) {
    if (this.age > o.age) {
      // if current object is greater --> return 1
      return 1;
    } else if (this.age < o.age) {
      // if current object is greater --> return -1
      return -1;
    } else {
      // if current object is equal to o --> return 0
      return 0;
    }
  }
}

输出:

Dhoni 11
Jadeja 18
Rohit 20
Virat 71
Shardul Thakur20
Jasprit Bumrah22

让我们看另一个比较两个对象年龄的 compareTo() 方法示例。

package java example;

import java.util.*;

public class SimpleTesting implements Comparable<SimpleTesting> {
  // Java Program which shows how to override the compareTo() method of comparable
  // interface

  // implementing Comparable interface
  int age;
  // Creating constructor
  SimpleTesting(int age) {
    this.age = age;
  }

  public static void main(String[] args) {
    // Creating a dynamic array by using an arraylist
    List<SimpleTesting> list = new ArrayList<>();

    // Inserting elements in the objects
    list.add(new SimpleTesting(56));
    list.add(new SimpleTesting(66));
    list.add(new SimpleTesting(21));
    Collections.sort(list);
    list.forEach(el -> System.out.println(el.age));
  }

  // Overriding compareTo() method
  @Override
  public int compareTo(SimpleTesting user) {
    return this.age >= user.age ? -1 : 0;
  }
}

输出:

66
56
21

在本教程中,我们看到了 Java 中用于排序的不同类型的技术。我们还了解了如何借助示例重写 Java 中的 compareTo() 方法。

相关文章 - Java Comparable