我正在尝试使用 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/