簡體   English   中英

java可比接口排序

[英]java comparable interface in sorting

我想到的是集合中的問題是使用可比較的界面構建我自己的默認排序順序。 我只想根據eid降序排列(int eid,String ename) 所以這是我在comapreTo方法中無法理解的邏輯。

public class First implements Comparable<First> {

private final int eId;
private final String eName;

public First(int eId, String  eName){
    this.eId = eId;
    this.eName = eName;
}

public int getEId() {
    return eId;
}

public String toString(){
    return eName + "------" + eId;
}

public int compareTo(First obj){
    int eId1 = this.eId;
    First f = (First) obj;
    int eId2 = f.eId;
    if (eId1 < eId2){ 
        return -1;
    } else if (eId1 > eId2){
        return +1;
    } else {
        return 0;
    }
}}

請說明這是如何工作的,還有其他實現方法嗎?

正如我所未見的那樣,您對問題的那一部分詢問“如何工作”表示理解,我想您對此可能仍然不清楚。 我看到您也無法根據某些答案中的注釋理解某些代碼背后的“邏輯”。

我們將以Mark Rotteveel給出的示例來解釋邏輯,因為我認為這是實現compareTo一種不錯的方法。

public int compareTo(First other){
if (eId < other.getEId()){ 
    return -1;
} else if (eId > other.getEId()){
    return +1;
} else {
    return 0;
}
}

我們有方法compareTo接受一個參數,該參數是First類型的對象-這是您創建的類。 此類型包括您包含在此類中的所有屬性,例如,具有一個getEId方法,該方法允許您返回在類First找到的私有全局變量eId

現在問題是compareTo other參數是它自己First對象的實例 ,而不是您在compareTo方法內部與之比較的那個對象(此部分: if (eId < other.getEId()) )。

compareTo方法內部,我們使用if-else語句檢查eId (它是指您當前的全局變量eId )是否與為第First對象(作為參數傳遞給compareTo方法)創建的eId有關。 所以這兩個不一樣的

正如您所說的那樣,您是編程新手,您制作了一個具有構造函數的類First

public First(int eId, String  eName){
this.eId = eId;
this.eName = eName;
}

然后,您可以像這樣制作兩個不同的 First對象:

First obj1 = new First(5, "Object 1");
First obj2 = new First(12, "Object 2");

在此示例中, obj1obj2 不是同一對象,並且固有地具有不同的eId值。 例如,您傳遞給compareTo方法的那個可能是obj2 ,它與當前正在比較的eId不同。

因此,當我們將obj2傳遞給類似compareTo(obj2) ,這意味着當到達到達讀取other.getEId的代碼部分時,它將執行obj2.getEId ,顯然返回的eId與內部的eId不同。如果聲明。 在此示例中,“ obj2.getEId ”將返回整數12,因為如您所見,我將obj2 eId設置為12。

if-else語句中的其余代碼非常簡單,如果當前正在比較的eId的整數值較小,則return -1else if其較大的return +1 else if其向上或向下移動根據其eId對它們進行排序。 在任何其他情況下都返回0,因為在這種情況下,它們在eId方面將相等。

我希望就事物背后的邏輯以及在compareTo中比較的eId實例eId不同,使代碼有所澄清。

equals方法和==!=運算符用於測試是否相等/不相等,但未提供測試相對值的方法。 一些類(例如String和其他具有自然順序的類)實現Comparable接口,該接口定義了compareTo方法。 如果要與Collections.sort()Arrays.sort()方法一起使用,則需要在您的類中實現Comparable<T>

您缺乏比較方法,一個正確的例子是:

public int compareTo(First other){
    if (eId < other.getEId()){ 
        return -1;
    } else if (eId > other.getEId()){
        return +1;
    } else {
        return 0;
    }
}

通過輸入Comparable接口,您可以知道比較哪種數據。 這樣可以確保進行正確的比較。 您的示例可能很快就會遇到NullPointerException

請解釋一下它是如何工作的

我想你的問題基本上是

為什么需要實現可比較的接口來對列表進行排序?

要對列表進行排序,首先需要告訴Java如何比較兩個對象。 這樣,Java可以找出哪個對象“更少”和哪個“更大”。 使用此信息,然后可以按升序或降序對列表進行排序。

您如何告訴Java哪個更大,哪個更少?

如果this是不是更大的other參數,返回1,如果this是小於other參數,返回-1。 否則,返回0。

還有其他實現方式嗎?

實際上,您當前的compareTo方法不會編譯。 更好的實現是:

public int compareTo(First other){
    return Integer.compare(this.getEId(), other.getEId());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM