2016-10-03 8 views
0

オブジェクトクラスのequalsをオーバーライドしたので、そのクラスのオブジェクトを配列リストに追加するたびに重複が発生するたびにダイアログボックスがポップアップするようになりました。しかし、これは配列リストのためのremove()でポップアップします。どのメソッドがequalsを使用するかに基づいて、これを条件付きにする方法はありますか? 2つの異なるequalsのように、または使用するequalsを指定できるようにする別の配列リストメソッドを使用しますか?1つのメソッドに対してのみequalsをオーバーライドする

編集: ご迷惑をおかけして申し訳ございません。残りについては

@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を使用します。 はここに私のオーバーライドされたequalsメソッドおよびhashCodeメソッドです。

+1

コードを表示すると、バグをトレースする最良の方法です。 –

+0

@Hemlataあなたは完全な質問を読んでいますか? –

+2

重複使用を避けたい場合は、セットを使用します。 remove()メソッドが使用されている場合、remove()は比較のためにequalsメソッドを使用するため、remove()はダイアログボックスを表示しているため、equalsメソッドはリスト内の要素を追加するときには使用されません。 – 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デザインパターンを参照すると、ユーザーインターフェイスと基になるデータ構造が切り離されます。一般に、UIコードは 'Car'のようなクラスには存在しません。 – 4castle

関連する問題