2016-09-17 78 views
1

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

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; 
    } 
}} 

請解釋這是如何工作的,有沒有其他的實施方式?

回答

2

正如我還沒有看到你表達的理解你的問題的一部分,詢問「它是如何工作:」我猜你可能仍然無法在這一目的明確。根據你在一些答案中的評論,我發現你不理解某些代碼背後的「邏輯」。

我們將採用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

現在的事情是在compareToother參數是它的自己一個First對象的實例,而不是你與compareTo方法內(此部分:if (eId < other.getEId()))比較同一個。

裏面compareTo方法,我們使用if-else語句來檢查是否eId(這是指當前的全局變量eId)到爲這是作爲參數傳遞給compareTo方法通過First對象創建的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同一個對象,和inherentl你有不同的eId值。例如,您傳遞給compareTo方法的方法可能是obj2,與當前比較的eId不同。

所以,當我們通過obj2成這樣compareTo(obj2)的方法,這將意味着,當它到達,讀取代碼的一部分other.getEId它會執行obj2.getEId這顯然返回不同的eIdeId if語句裏面。在這個例子'obj2.getEId'中,它會返回整數12,因爲正如你所看到的,我早些時候將eId設置爲12 obj2

代碼的if-else語句的其餘部分是相當簡單的,如果你正在使用比較eId較小值的一個整數而言,return -1else if其更大return +1將其向上或向下移動到根據他們的eId對它們進行排序。在任何其他情況下返回0,因爲在這種情況下,它們將相等於eId

我希望根據邏輯背後的邏輯澄清一下代碼,以及compareTo中比較的eId實例是如何不同的。

1

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

1

您的比較方法缺乏,適當的例子是:

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

通過鍵入可比界面,你可以告訴什麼樣的數據被比較。這確保了適當的比較。你的例子很快就會碰到NullPointerException

+0

我已經消除了你的火焰;它沒有回答這個問題,只是爲了分散你的實際答案。將來請用評論指出問題的不足之處,並記住[很好](http://stackoverflow.com/help/be-nice)。 –

+0

感謝您的幫助我下次編輯代碼將確保它不會被重複。我是一個編程新手,你可以解釋你的邏輯是如何工作的。 – Digs

1

請解釋一下這是如何工作

我想你的問題基本上是,

爲什麼我需要實現媲美接口列表排序?

要排序列表,首先需要告訴Java如何比較兩個對象。這樣,Java可以計算出哪個對象是「少」,哪個是「更大」。使用這些信息,可以按升序或降序對列表進行排序。

你怎麼知道Java哪個更大,哪個更少?

如果thisother參數越大,返回1.如果this小於other參數,返回-1。否則,返回0.

有沒有其他的實現方式?

其實,您當前的compareTo方法不能編譯。更好的實現是:

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

'this'和'other'都調用相同的變量吧? – Digs

+0

是的。你可以在'this'和'other'上調用'getEId'。然後使用'Integer.compare'來比較返回值。 @Digs – Sweeper

+0

如果您認爲我的答案回答了您的問題,請考慮點擊該選中標記來接受答案。 @Digs – Sweeper