[英]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");
在此示例中, obj1
和obj2
不是同一對象,並且固有地具有不同的eId
值。 例如,您傳遞給compareTo
方法的那個可能是obj2
,它與當前正在比較的eId不同。
因此,當我們將obj2
傳遞給類似compareTo(obj2)
,這意味着當到達到達讀取other.getEId
的代碼部分時,它將執行obj2.getEId
,顯然返回的eId
與內部的eId
不同。如果聲明。 在此示例中,“ obj2.getEId
”將返回整數12,因為如您所見,我將obj2
eId
設置為12。
if-else語句中的其余代碼非常簡單,如果當前正在比較的eId
的整數值較小,則return -1
, else 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.