java - HashSet 未删除所有重复条目

标签 java eclipse guava

我正在尝试使用 HashSet 来确保我从 .txt 文件读取的数据是唯一的。

以下是示例数据;

999990  bummer
999990  bummer
999990  bummer
999990  bummer
99999   bummer
999990  bummerr

使用 Java.io.File 和 Java.util.Scanner 读取并存储为术语对象;

阅读术语;

while (rawTerms.hasNextLine()){
    String[] tokens = rawTerms.nextLine().trim().split(delimiter);
    if (tokens.length == 2) {               
        uniqueSet.add(new Term(Double.parseDouble(tokens[0]), tokens[1])); //add the term to set
    }
    else {
      rawTerms.close();
      throw new Exception("Invalid member length: "+ tokens.length);
    }           
}

allTerms = new ArrayList<>(uniqueSet); //Covert set into an ArrayList

使用 Guava 的术语类;

public Term(double weight, String theTerm){
    this.weight = weight;
    this.theTerm = theTerm;
}


@Override
public boolean equals(final Object obj) {
    if (obj instanceof Term){
        final Term other = (Term) obj;
        return Objects.equal(this.weight, other.weight)
                && Objects.equal(this.theTerm, other.theTerm);
    }
    else {
        return false;
    }
}

@Override
public String toString(){
    return toStringHelper(this).addValue(weight)
            .addValue(theTerm).toString();

}

@Override  
public int hashCode() {  
    return Objects.hashCode(this.weight, this.theTerm);  
}

但是,当我运行测试来检查存储条目的数组的大小时,我得到了 3 个条目,而不是我想要的 1 个条目。我希望任何与之前添加的条目具有相同权重或术语的新条目都被视为重复。

感谢所有帮助!

马特

最佳答案

I would like any new entry with either the same weight or term as previously added entries to be considered a duplicate.

这不是平等的运作方式。相等必须是可传递的 - 因此如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,则 x.equals(z) 必须返回 true。

您想要的关系并非如此。

请注意,这也不是您的 equals 方法目前检查的内容:

return Objects.equal(this.weight, other.weight)
    && Objects.equal(this.theTerm, other.theTerm);

仅当权重项匹配时才返回 true,这对于相等关系来说是正常的。这就是为什么您的集合中会出现三个条目 - 因为以这种方式查看时,您确实拥有三个不同的实体。

从根本上来说,HashSet 和所有其他处理相等性的集合不会以简单的方式帮助您。您需要拥有三个单独的集合:

  • 一组权重
  • 一组术语
  • 一组(或列表)条目。

如果您正在考虑的条目在权重集中有一个权重术语集中有一个术语,您应该跳过它 - 否则,您应该向每个术语添加一个条目三个集合。

关于java - HashSet 未删除所有重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40382130/

相关文章:

java - 是否可以使用客户生成器在 JOOQ 中将两个数据库字段合并为一个?

java - 当连接多个设备时如何将 Appium 服务器保持为其分配的 AppiumDriver

java - 使用 Guava Cache 作为基于时间驱逐的映射

java - log4j 配置概述

java - 如何使用 Spring RestTemplate POST 表单数据?

java - eclipse 中的 Tomcat 服务器不适用于 Gradle 构建项目

eclipse - Eclipse 中有重新运行最近启动的程序的快捷方式吗?

java - Eclipse Java printf 问题 PrintStream 不适用

java - 谓词#and : any way to access the internal predicates?

java - 过期不可变集合