替换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); 

尝试以下内容(这只有在equalshashCode依赖于一个字段时才有意义,但其他字段可能具有不同的值):

 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被称为“未触及”。