替换HashSet Java成员
我有那个结构的集合。 我没有重复,但是当我调用: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); }
哪个更有效取决于你碰撞的频率。 如果它们很少见,第二种forms通常只进行一次操作,但是当发生碰撞时它会做三次。 第一种forms总是两种。
如果集合已经包含一个equals()
您尝试添加的元素的元素,则不会添加新元素,也不会替换现有元素。 要保证添加新元素,只需先将其从集合中删除:
set.remove(aWordInfo); set.add(aWordInfo);
尝试以下内容(这只有在equals
和hashCode
依赖于一个字段时才有意义,但其他字段可能具有不同的值):
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
方法的文档
如果此set已包含该元素,则调用将保持set不变并返回false。
我正在处理一个问题,我有一个集合,然后我想用另一个集合中的对象替换/覆盖一些对象。
在我的情况下,我最终做的是创建一个新集合并首先放置覆盖,然后再添加当前对象。 这是有效的,因为在添加新对象时,集合不会替换任何现有对象。
如果你有:
Set currentInfo; Set overrides;
代替:
for each override, replace the object in current info
我做了:
Set updated = new HashSet<>(); updated.addAll(overrides); updated.addAll(currentInfo);
检查JDK中的HashSet
代码。 添加元素并且是重复元素时,将替换旧值。 民间认为新元素被丢弃,这是错误的。 因此,在您的情况下,您不需要其他代码。
更新 – – – – – – – – – – –
我重新阅读了JDK中的代码,并承认我犯了一个错误。
在进行put
,VALUE将替换为HashMap
的KEY。
我为什么要谈论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 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
没有被替换,并且由于key
s表示HashSet's
值,因此这个key
被称为“未触及”。