2016-10-03 68 views
0

我已經重寫了一個對象類的等號,以便每次向數組列表中添加該類的對象時發生重複,都會彈出一個對話框。但是這會彈出remove()for數組列表。有沒有一種方法可以根據哪種方法使用equals來使這個條件成立?像兩個不同的等號,或者可能使用另一個數組列表方法,可以讓你指定哪個等於使用?覆蓋等於只有一個方法

編輯: 抱歉,我的問題很不清楚。 這裏是我重寫的equals和hashCode方法:

@Override 
public boolean equals(Object s) { 
    if(!(s instanceof Car)) { 
    return false; 
} 

    Car s2 = (Car)s; 
    if(this.name.equals(s2.name) && this.ride.equals(s2.ride)){ 
     Alert alert = new Alert(AlertType.INFORMATION); 
     alert.setTitle("Delete Item"); 
     alert.setHeaderText(
     "Are you sure?"); 
     alert.showAndWait(); 
     return true; 
    } 
    return false; 

} 

@Override 
public int hashCode(){ 
    int hashC; 

    hashC = name.hashCode(); 
    hashC *= ride.hashCode(); 
    return hashC; 
} 

至於其他的,我用的是HashSet的自動刪除重複。

+1

顯示你的代碼是追蹤錯誤的最佳方法 –

+0

@Hemlata你看過完整的問題嗎? –

+2

如果你想避免重複使用set。在列表中添加元素時不使用equals方法,因此覆蓋它沒有用處,remove()顯示對話框的原因是因爲remove()使用equals方法進行比較,因此使用remove(object)方法時。 – pkoli

回答

1

不要讓equals做的事情比contract所說的要多。請使用indexOf的檢查來查看該元素是否已存在於List中。

if (list.indexOf(object) != -1) { 
    dialog.show(); 
} else { 
    list.add(object); 
} 

如果您不希望收集包含任何重複,你不但是關心元素的順序,你應該用一個HashSet代替List。這將通過檢查equals自動排除重複項,並且在存在重複項時將在add方法上返回false。您還需要覆蓋對象上的hashCode方法。

if (!set.add(object)) { 
    dialog.show(); 
} 
+0

是的,儘管後來出現了一些缺陷,但我認爲我儘量保留舊代碼。謝謝您的幫助。 –

+0

@MohSel你可能想要查看MVC設計模式,它將用戶界面從底層數據結構中分離出來。一般來說,不應該在像Car這樣的類中找到UI代碼。 – 4castle