その構造のセットがあります。重複はありませんが、set.add(element)->を呼び出すと、すでに正確な要素があり、古いものを置き換えたいと思います。
import Java.io.*;
public class WordInfo implements Serializable {
File plik;
Integer wystapienia;
public WordInfo(File plik, Integer wystapienia) {
this.plik = plik;
this.wystapienia = wystapienia;
}
public String toString() {
// if (plik.getAbsolutePath().contains("src") && wystapienia != 0)
return plik.getAbsolutePath() + "\tWYSTAPIEN " + wystapienia;
// return "";
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof WordInfo)) return false;
return this.plik.equals(((WordInfo) obj).plik);
}
@Override
public int hashCode() {
return this.plik.hashCode();
}
}
追加する前に削除を行います:
someSet.remove(myObject);
someSet.add(myObject);
Removeは、myObjectと等しいオブジェクトをすべて削除します。または、追加結果を確認することもできます。
if(!someSet.add(myObject)) {
someSet.remove(myObject);
someSet.add(myObject);
}
どちらがより効率的かは、衝突の頻度に依存します。それらがまれである場合、2番目のフォームは通常1つの操作のみを実行しますが、衝突がある場合は3つ実行します。最初のフォームは常に2つ実行します。
セットに、追加しようとしている要素equals()
の要素がすでに含まれている場合、新しい要素は追加されず、既存の要素を置き換えません。新しい要素が確実に追加されるようにするには、最初に要素をセットから削除するだけです。
set.remove(aWordInfo);
set.add(aWordInfo);
次のようにしてみてください(これは、equals
とhashCode
が1つのフィールドに依存する場合にのみ意味がありますが、他のフィールドは異なる値を持つ可能性があります):
if(!set.add(obj)) {
//set already contains the element (not the same object though)
set.remove(obj); //remove the one in the set
set.add(obj); //add the new one
}
Set.add
メソッド
このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずにfalseを返します。
セットがある問題に取り組んでいたときに、一部のオブジェクトを別のセットのオブジェクトで置き換えたり上書きしたりしたかった。
私の場合、最終的に新しいセットを作成してオーバーライドを最初に配置し、次に現在のオブジェクトを2番目に追加しました。これは、新しいオブジェクトを追加するときにセットが既存のオブジェクトを置き換えないため機能します。
あなたが持っている場合:
Set<WordInfo> currentInfo;
Set<WorldInfo> overrides;
の代わりに:
for each override, replace the object in current info
やった:
Set<WordInfo> updated = new HashSet<>();
updated.addAll(overrides);
updated.addAll(currentInfo);