【问题标题】:How to remove duplicates in the Java HashSet如何删除 Java HashSet 中的重复项
【发布时间】:2012-11-19 03:44:01
【问题描述】:

我有一套这样的结构。如何删除该类的相同对象的重复项?等于表示字段 File plik 相同。

编辑: 但是问题更大我没有重复但我想用新的替换旧的 SET 成员。

没有第三方库。

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 "";
    }

}

编辑

我没有这个HashCodeBuilder我想用Java标准库

 public int hashCode() {
            return new HashCodeBuilder(17, 31).append(plik).append(wystapienia).toHashCode();
        }

    public boolean equals(Object obj) {
        File f = (File) obj;
        return(plik.getAbsoluteFile().equals(f.getAbsolutePath()));
    }

【问题讨论】:

  • 覆盖 equalshashcode...一组自动禁止重复。
  • 你不必使用 Apache 的 HashCodeBuilder 来实现 hashCode。您可能可以使用File 实现的hashCode 方法,假设有一个。应该很容易检查...在我输入此内容两秒钟后,@BheshGurung 提供了一个答案,确切地说明了如何进行检查!
  • @mre 请看编辑

标签: java set duplicates


【解决方案1】:

正如here 所讨论的,覆盖等于。

public class Person {
    private String name;
    private int age;
    // ...

    public int hashCode() {
        return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
            // if deriving: appendSuper(super.hashCode()).
            append(name).
            append(age).
            toHashCode();
    }

    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (obj.getClass() != getClass())
            return false;

        Person rhs = (Person) obj;
        return new EqualsBuilder().
            // if deriving: appendSuper(super.equals(obj)).
            append(name, rhs.name).
            append(age, rhs.age).
            isEquals();
    }
}

【讨论】:

  • 这些方法是什么,它们没有实现甚至没有声明
  • HashCodeBuilder 类不存在
  • @RobertKilar - 它们来自 Apache Commons Lang 库(请参阅答案中的链接)。腾讯试图说明的一点是 Set(根据定义)不包含重复项。为了让 Set 使用自定义对象,您必须为您的类实现 equalshashCode
  • OP已经为hashCode定义了一个非常简单的要求......当你可以使用File.hashCode时,真的不需要使用HashCodeBuilder.
  • 你没有抓住重点。关键是已经提出了这个问题,并且 OP 可以使用我链接的线程和我从原始线程中提取的源来回答问题。我没有看到为操作编写代码的价值,因为它会带走学习经验。
【解决方案2】:
public class WordInfo implements Serializable {
    File plik;

考虑到以下是如何根据您的要求覆盖 equalshashCode 方法:

@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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多