我有一个带有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);
}
}
答案 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}。