為了組織儲存在數組或集合中的相同類型的對象,Java 開發人員提出了
對物件陣列進行排序的最簡單、最有效的方法之一是類別
Comparable
. 它只聲明了一種方法compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
介面Comparable
透過它接受作為方法參數的物件類型來參數化compareTo
。在這種情況下,我們警告編譯器我們要比較什麼類型的物件。如果不滿足類型標識條件,我們將收到錯誤ClassCastException
。Java 中的方法compareTo
將呼叫物件與作為參數傳遞的物件進行比較,並傳回一個整數作為比較結果:
- 若呼叫對像大於作為參數傳遞的對象,則為正;
- 如果呼叫對像小於作為參數傳遞的對象,則為負;
- 如果物件相等則為 null。
Java中為什麼需要compareTo方法?
Java 程式設計師經常需要處理陣列和物件清單。當處理大量資料時,以有組織或排序的形式儲存資料通常很方便。首先,它在搜尋必要資訊時加快了對集合的處理速度,其次,組織好的資料在視覺上可以更好地感知。sort()
方法Arrays
,列表形式的物件集合也是類似的類別方法Collections
。為了使用這些方法進行排序,Java 開發人員讓我們可以自由選擇如何指定排序標準:透過在Comparable
我們想要排序的物件類別中實作接口,或使用Comparator
. 在第一種情況下,排序方法接受陣列或列表形式的一組物件:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
在第二個中 - 加上該介面的另一個實作Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Comparable
當我們想要在排序時設定物件的自然順序(從我們的角度來看最符合邏輯)時,可以使用 該介面。這也是一種在設計階段「硬連線」用於比較此類物件的演算法的方法。例如,使用此介面的實現,定義了主要基元類型的包裝類別中的自然排序標準:, Byte
, Character
, Long
, Integer
, Short
, Double
, Float
, Boolean
。String
這也意味著這些類別有一個實現的方法compareTo
,我們可以在需要時在程式中使用。我們透過一個字串比較的例子來看看這個方法在類別中是如何實現的String
。
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
如果我們在方法中執行這段程式碼main
,我們將得到以下結果:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
正如您在類別中的範例中看到的String
,該方法compareTo
按字母順序、字典順序和區分大小寫排列字串。類別的開發人員將這種字串比較順序定義String
為自然的。為了更簡單地理解什麼是字典順序,記住單字在語言字典中的排列方式就足夠了。比較數字時,物件依升序排列。此比較邏輯嵌入在類別Byte
, Character
, Long
, Integer
, Shor
, Double
,中Float
。
讓我們在我們的班級中實現比較
讓我們來看一個範例,了解如何在類別中建立比較物件的能力。在實作compareto
Java 方法時,我們可以指定一個或多個物件排序標準,也可以使用和類別compareto
中的方法。例如,對於類別對象,我們設定按名稱排序,如果名稱相同,則按年齡排序。物件將按其自然順序排列(隨著值的增加)。班級: String
Integer
User
User
public class User implements Comparable <User>{//добавляем возможность сравнивать an objectы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
讓我們使用類別方法來測試compareTo
類別中實作的 方法的運行情況: User
sort
Collections
public static void main(String[] args) {
User user = new User("Andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("Andrey", 24,"opr@google.com");
User user4 = new User("Igor", 16, "igor@mail.ru");
User user5 = new User("Andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
此方法的結果main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
那麼,我們來總結一下。如果您是一切事物秩序的支持者,並且希望將物件排列在陣列或清單中,而無需編寫不必要的程式碼,請使用介面Comparable
。它的compareTo方法的實作使得在類別中建構自然排序物件的機制變得非常容易。如果您必須使用 Java 庫中描述的標準類別的物件集合和數組,請在這些類別中使用現成的實作compareTo
。
GO TO FULL VERSION