【问题标题】:Can I use only HashMap?我可以只使用 HashMap 吗?
【发布时间】:2015-12-03 08:29:50
【问题描述】:

上下文

我有一个带有 4 个原始变量的对象 O:

  • a、b、c 和 d。 (全部 4 项必填)

  • 前 3 个是键,我用它们来生成 hashcode 和 equals。

  • “d”是一个计数器,从1开始。

  • 我有一个 HashSet 和一个插入 O 项的循环,

  • 如果 HashSet 包含重复项(键:a、b、c),我会将存储在 HashSet 中的项 O 修改为 d++(否则我将该项添加到 HashSet)。

但我无法从 HashSet 中获取项目(HashSet 没有 .get 方法)。

问题

所以处理这个问题的唯一(也是最好的)方法是制作 HashMap ?

我的解决方案

    class O {
       int a, b, c, d;

       boolean equals(Object o) { /* handle only a,b,c */ }
       int hashCode() { /* handle only a,b,c */ }
    }

...


        HashMap<O, O> group = new HashMap<O, O>();
        O curr = null;
...
            while (...) //Iterate the result set from a query where I can't use groupBy
            {
                curr = new O();
                curr.setA(...);
                curr.setB(...);
                curr.setC(...);
                O ex = group.get(curr);
                if (ex != null)
                {
                    ex.setD(ex.getD()+1);
                }
                else
                {
                    group.put(curr , curr);
                }
            }

【问题讨论】:

  • 不,通过HashSet是可能的
  • 你能展示你的代码吗?
  • 我觉得HashMap很适合,为什么不用呢?
  • 不清楚,为什么不能从HashSet中获取item。
  • 只是回顾一下,以及我是否正确理解了这个问题。您想要带有私有 get 方法的 HashMap 吗?

标签: java hashmap hashset


【解决方案1】:

我认为更简单的方法可能是如下:

class O {
   int a, b, c;

   boolean equals(Object o) { /* your code */ }
   int hashCode() { /* your code */ }
}

Map<O, Integer> map = new HashMap<>();
for (O obj: oCollection) {
   if (map.contains(obj)) {
       map.put(obj, map.get(obj) + 1);
   } else {
       map.put(obj, 1);
   }
}

这样你就可以使用HashMap而不是类中的额外字段来计算它们。

【讨论】:

  • 是的,这几乎是我的解决方案。只是 O 类有 4 个变量 int a, b, c, d;
  • 是的,但我是说您不需要d,您可以使用HashMap 来进行计数。如果您愿意,您仍然可以拥有d,但在 Map 构造中不再需要它。
  • 是的,我不需要 d 来完成这个任务,但它是其他东西的先决条件,所以对象必须是那种方式。
  • 当然你仍然可以包含它。只是不要在 hashcode 方法中使用它
【解决方案2】:

简短答案:是的,您可以使用 HashSet,使用迭代器查找元素,但该解决方案很麻烦。 HashMap 方法在可读性和性能方面要好得多。这是最好的选择吗?与往常一样,这取决于...

由于您没有定义可以使用的库的限制,所以让我向您介绍接口Bag, from the Apache collections

定义一个统计对象出现次数的集合 在集合中。假设您有一个包含 {a, a, b, c} 的 Bag。 在 a 上调​​用 getCount(Object) 将返回 2,同时调用 uniqueSet() 将返回 {a, b, c}。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2012-02-27
    • 2022-01-17
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多