当前位置: 首页 > 知识库问答 >
问题:

具有多个整数值的键的良好hashcode和equals实现

梁豪
2023-03-14

我有一个hashmap有这样的键:'2+4+5','653+65+1324+75'。(整数值用+号分隔)

什么是一个好的hashcode和equals方法,使得像'2+4+5','5+4+2','4+5+2'...(所有2,4,5的排列)这样的键应该返回相同的hashcode值,而equals应该返回true。

我计划在键中取整数值,对它们进行排序,按升序将它们放入一个字符串中,并调用strings hashcode和equals方法。假设如果我有'5+2+4',那么我将其更改为“245”,并调用字符串hashcode和equals方法。但这将是一个昂贵的操作,因为每次我都要做排序。以及散列图中的所有方法,如put、get……。也会很贵

有没有其他方法可以在对数或线性时间内...

共有1个答案

长孙高远
2023-03-14
class Combination {
    final int[] parts;

    Combination(String str) {
        String[] strings = str.split("\\+");
        parts = new int[strings.length];
        for (int i = 0; i < parts.length; i++) {
            parts[i] = Integer.parseInt(strings[i]);
        }
        Arrays.sort(parts);
    }

    @Override public int hashCode() {
        return Arrays.hashCode(parts);
    }

    @Override public boolean equals(Object o) {
        return o instanceof Combination && Arrays.equals(parts, ((Combination) o).parts);
    }
}

测试代码:

public static void main(String[] args) {
    Set<Combination> set = new HashSet<>();
    set.add(new Combination("1+2+3"));
    set.add(new Combination("1+2+4"));
    System.out.println(set.contains(new Combination("3+2+1"))); // prints "true"
    System.out.println(set.contains(new Combination("4+2+1"))); // prints "true"
    System.out.println(set.contains(new Combination("4+3+1"))); // prints "false"
}
 类似资料:
  • 根据我所读到的, 要使用对象作为hashMap的键,它必须提供正确的重写和equals和hashCode方法的实现。HashMap get(Key k)方法调用Key对象上的hashCode方法,并将返回的hashValue应用到它自己的静态哈希函数中,以找到一个桶位置(备份数组),键和值以名为Entry(Map.Entry)的嵌套类的形式存储在这里。HashMap的内部哈希方法防御质量差的哈希函

  • 我正在覆盖两个int的简单容器对象的equals和hashcode方法。每个int反映另一个对象的索引(该对象是什么并不重要)。该类的目的是表示两个对象之间的连接。 连接的方向无关紧要,因此equals方法应该返回true,无论两个整数在对象中以何种方式循环。 这是我所拥有的(从整数的源代码修改): 但我的问题是:有没有更好的方法来实现这一点? 我主要担心的是hashcode()方法会为任何两个相

  • 问题内容: 如果我只需要比较对象并且还不打算将对象放入任何基于哈希的容器中,我是否只能实现equals()而不是hashCode()? 似乎所有Java圣经都说这两个必须一起实现。:( 我的担心:-如果我始终将hashCode()与equals()一起实现,将有很多未真正使用的代码,并且没有单元测试的内容。(如果不使用,我不会进行单元测试hashCode())-直到将对象放入基于哈希的容器中时,我

  • 问题内容: 我定义了两个类,以便它们都包含对另一个对象的引用。它们看起来与此类似(这是简化的;在我的实际域模型中,类A包含一个B列表,每个B都有对父A的引用): 在与已通过使用Eclipse中A和B这两个问题的两个场产生的是调用或在任一对象方法的结果在因为它们都调用另一个对象的和方法。例如,以下程序将无法使用上述对象: 如果用这种方式用循环关系定义域模型存在内在的错误,请告诉我。据我所知,虽然这是

  • 问题内容: hashCode方法的最佳实现中可接受的答案为查找哈希码提供了看似不错的方法。但是我是哈希代码的新手,所以我不太了解该怎么做。 对于1),选择哪个非零值有关系吗?是一样好其他数字,如:黄金? 对于2),我是否将每个值添加到c?如果我有两个字段都是一个,,,等? 我在这堂课上解释得对吗? 问题答案: 该值并不重要,它可以是您想要的任何值。质数将导致值的更好分布,因此首选。 您不必添加它们

  • 如果你有如下需求,你必须重载 equals() 和 hashCode() 方法: 想把持久类的实例放入 Set 中(当表示多值关联时,推荐这么做),而且 想重用脱管实例 Hibernate 保证,仅在特定会话范围内,持久化标识(数据库的行)和 Java 标识是等价的。因此,一旦我们混合了从不同会话中获取的实例,如果希望 Set 有明确的语义,就必须实现 equals() 和 hashCode()。