我只能使用HashMap吗?

时间:2015-12-03 08:29:50

标签: java hashmap hashset

上下文

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

  • a,b,c和d。 (全部4强制性)

  • 前三个是键,我用它们来生成哈希码和等号。

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

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

  • 如果HashSet包含副本(key: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);
                }
            }

2 个答案:

答案 0 :(得分:2)

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

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而不是类中的额外字段来计算它们。

答案 1 :(得分:1)

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

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

  

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