33

その構造のセットがあります。重複はありませんが、次のように呼び出すと 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();
    }
}
4

5 に答える 5

60

追加するたびに削除を行います。

 someSet.remove(myObject);
 someSet.add(myObject);

remove は、myObject と等しいすべてのオブジェクトを削除します。または、追加結果を確認できます。

 if(!someSet.add(myObject)) {
     someSet.remove(myObject);
     someSet.add(myObject);
 }

どちらがより効率的かは、衝突の頻度によって異なります。それらがまれな場合、2 番目のフォームは通常 1 つの操作のみを実行しますが、衝突が発生した場合は 3 つの操作を実行します。最初の形式は常に 2 つ実行します。

于 2012-11-19T04:18:19.463 に答える
5

追加しようとしている要素がセットに既に含まれている場合equals()、新しい要素は追加されず、既存の要素を置き換えません。新しい要素が確実に追加されるようにするには、最初にセットから削除します。

set.remove(aWordInfo);
set.add(aWordInfo);
于 2012-11-19T04:19:25.310 に答える
0

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 を返します。

于 2012-11-19T04:17:31.520 に答える
-2

HashSetJDK内のコードを確認してください。要素が追加されて重複している場合、古い値が置き換えられます。フォークは、新しい要素が破棄されると考えています、それは間違っています。したがって、この場合、追加のコードは必要ありません。

更新しました - - - - - - - - - - -

JDKでコードを読み直し、間違いを認めました。

put作成されると、のKEYではなくVALUEが置き換えられHashMapます。

なぜ私は話しているのですHashmapか??!! HashSetコードを見ると、次のことに気付くでしょう。

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

したがって、PRESENTコードのこの部分に示すように、値は新しい値に置き換えられます。

      public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

しかし、私は同意します。これkeyは置き換えられません。skeyは値を表すためHashSet's、これは「変更されていない」と言われます。

于 2012-11-19T04:16:15.750 に答える