替换HashSet Java成员

Yod*_*oda 22 java replace set duplicates

我有那个结构的集合.我没有重复,但是当我调用: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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*han 41

在每次添加之前删除:

 someSet.remove(myObject);
 someSet.add(myObject);
Run Code Online (Sandbox Code Playgroud)

remove将删除任何等于myObject的对象.或者,您可以检查添加结果:

 if(!someSet.add(myObject)) {
     someSet.remove(myObject);
     someSet.add(myObject);
 }
Run Code Online (Sandbox Code Playgroud)

哪个更有效取决于你碰撞的频率.如果它们很少见,第二种形式通常只进行一次操作,但是当发生碰撞时它会做三次.第一种形式总是两种.

  • @ThreaT这是与该问题不同的问题,该问题与在可能被调用的情况下更改add的行为有关。我建议将其作为一个新问题提出,其背景要比注释中要多,除非可以找到现有的问题来帮助您。 (2认同)

Ted*_*opp 6

如果集合中已包含equals()您尝试添加的元素,则不会添加新元素,也不会替换现有元素。为了保证添加新元素,只需先将其从集合中删除即可:

set.remove(aWordInfo);
set.add(aWordInfo);
Run Code Online (Sandbox Code Playgroud)