【问题标题】:Two Key HashSet?两键哈希集?
【发布时间】:2010-04-10 10:12:01
【问题描述】:

我需要一个 HashSet 实现,其中元素是一对整数
例如。 Set s = { {1,2} , {3,4} , {1,4}}。这里集合 s 有 3 个元素。

在许多情况下都需要这种两键 HashSet,例如,我的数据库中有一个关系,其中候选键是两列的组合。
是否有一些图书馆已经提供了这个? 如果没有这样的实现,那么与其从头开始实现整个数据结构,那么在 Java 中扩展 HashSet 实现会更容易(和高效吗?)?

【问题讨论】:

  • 由于 Adamski 提出的观点,使用 HashSet<int[]> 并没有帮助。因此,创建了一个包含整数列表的数据持有者,并提供了 equals 和 hashcode 实现。

标签: java hashset


【解决方案1】:

为了这个要求,我将创建一个数据持有者,其中 2 个整数作为属性,并提供 equals 和 hashcode 实现。然后将这些对象放入 Set 中。

【讨论】:

    【解决方案2】:

    将一个包含 2 个元素的数组作为集合的成员不是吗?即:

    Set<int[]> s = new HashSet<int[]>();
    s.add(new int[] {1,2});
    s.add(new int[] {3,4});
    

    或者创建一个类CandidateKey,它有两个字段和一个自定义equals()hashCode() 方法?

    说了这么多,您确定要自己处理对象关系映射(从数据库到对象的映射),而不是使用 Hibernate 或 EclipseLink 之类的库吗?

    【讨论】:

    • 这真的有效吗?我原以为数组的默认 equals 和 hashCode 实现是基于身份的。
    • 他们是,但在某些情况下可能就足够了——我不知道他是否是这样。这就是为什么添加关于新类的建议,其中正确实现了equals和hashcode。
    • 建议的 int[] 解决方案有一个限制。没有什么可以阻止您添加元素更少或更多的数组,例如int[] 空 = 新的 int[0];或 int[] Triple = new int[] {1, 2, 3};.
    • @matsev - 没有什么能阻止你拥有超过 2 列的候选键;)
    【解决方案3】:

    在这种情况下可以使用整数列表:

    Set<List<Integer>> s = new HashSet<List<Integer>>();
    s.add((List<Integer>)Arrays.asList(new Integer[] {2,4}));
    s.add((List<Integer>)Arrays.asList(new Integer[] {2,4}));
    s.add((List<Integer>)Arrays.asList(new Integer[] {2,5}));
    

    hashCode() and equals()helpers 内置在 ArrayList 类中。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2017-12-18
      • 2011-07-01
      • 2013-03-30
      • 1970-01-01
      相关资源
      最近更新 更多