重寫 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