【问题标题】:setting hashcode and equals to create a set with unique object设置哈希码和等于以创建具有唯一对象的集合
【发布时间】:2012-01-19 11:48:20
【问题描述】:

我将创建一个 Set 恰好是 HashSet 以仅包含 char。例如 a,b,c,d,e,f,g... 但是这些chars 不是由原始类型表示的,但我有一个对象

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

现在我想将对象 FirstChar 添加到集合中,但为避免重复元素,我必须实现 HashCode()equals()

我知道如何实现equals,但我如何实现hashcode,因为我只能在集合中拥有一个元素?

注意。请不要说我用Eclipse

【问题讨论】:

  • 您希望每个 'a'、'b'、'c' 等最多有一个,还是整个集合中只有一个字符?
  • 是的。只有一个字母在整个集合中
  • @Mazzy:所以您希望FirstChar每个 实例都与其他所有实例相同?这听起来很奇怪。也许您可以更详细地解释您的用例。

标签: java hash-code-uniqueness


【解决方案1】:

编辑:我刚刚阅读了您的评论,即您只想要整个集合中的一个字母 - 这听起来像一个 非常 奇怪的要求,但基本上可以通过以下方式实现:

public final class FirstChar {

  private final char c;

  public FirstChar(char c) {
    this.c = c;
  }

  @Override public int hashCode() {
      return 0;
  }

  @Override public boolean equals(Object other) {
      return other instanceof FirstChar;
  }
}

换句话说,FirstChar 的每个实例都被视为与其他所有实例相等,并且它们都具有相同的哈希码。正如我所说,这真的很奇怪......一定是你想要的吗?


原答案

为逻辑上只有一个字符的值实现hashCode() 很容易:

@Override
public int hashCode() {
    return c; // Use implicit conversion to int
}

检查Object.hashCode 的合同,你会发现这很好——假设你的equals 方法基本上只是比较c 的值。 (当你写“我只能在集合中只有一个元素”时,不清楚你的意思是什么——我假设你的意思是每个不同的字符只有一个元素。)

但是,我对您的 FirstChar 类提供的价值比仅使用 java.lang.Character 提供的价值感到困惑。你有什么理由不能只使用Set<Character>

【讨论】:

  • Jon Skeet 偶尔会赢得如此多的徽章,以至于通知会隐藏他的整个浏览器。他继续畅通无阻地回答问题。
  • 我不使用 wrapper Character 的原因是因为每个字母都必须包含一个对象 Person 的集合,他们的姓氏以该字母开头
  • @Mazzy:这听起来像是一个非常奇怪的要求 - 有什么理由你不使用 Map<Character, List<Person>> 或类似的东西(例如来自 Guava 的 Multimap)?
  • 原因是因为我想要一个不重复的元素集合,但是每个元素都必须包含一个列表,所以每个元素都必须是一个对象才能包含一个集合
  • @JonSkeet 但 Map 有两个字段。键和值。现在我只需要一个字段。在集合中,我们可以有更多具有相同姓氏首字母的人,所以 Map 帮不了我
【解决方案2】:

无论如何,据我所知,Character 类中的hashCode 方法只是将char 作为int 返回。

在您的特定情况下,如果您希望该集合仅包含添加到其中的第一个 FirstChar,您可以使所有 FirstChars 彼此相等:

class FirstChar{
    private char c;
    public FirstChar(char c){
        this.c=c;
    }
    public String toString(){
        return String.valueOf(c);
    }
    public boolean equals(Object o){
        return o instanceof FirstChar;
    }
    public int hashCode(){        
        return 42;
    }
}

但除非你有充分的理由,否则这听起来不是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2015-09-13
    • 2016-04-08
    • 2011-10-21
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多