Java 我只能使用HashMap吗? 上下文

Java 我只能使用HashMap吗? 上下文,java,hashmap,hashset,Java,Hashmap,Hashset,我有一个对象O,它有4个基本变量: a、 b、c和d。(全部4个为必填项) 前3个是键,我用它们生成hashcode和equals “d”是一个计数器,它从1开始 我有一个哈希集和一个循环,可以插入O个项 如果HashSet包含一个重复项(键:a、b、c),我会将HashSet中存储的O项修改为dod++(否则我会将该项添加到HashSet) 但我无法从HashSet获取项(HashSet没有.get方法) 问题: 所以处理这个问题的唯一(也是最好的)方法是制作HashMap 我的解决方案

我有一个对象O,它有4个基本变量:

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

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

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

  • 我有一个哈希集和一个循环,可以插入O个项

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

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

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

我的解决方案
O类{
INTA、b、c、d;
布尔等于(对象o){/*仅处理a、b、c*/}
int hashCode(){/*仅处理a、b、c*/}
}
...
HashMap组=新建HashMap();
O curr=null;
...
while(…)//从无法使用groupBy的查询中迭代结果集
{
curr=新的O();
当前刚毛(…);
当前挫折(…);
当前setC(…);
O ex=组获取(当前);
如果(ex!=null)
{
例如setD(例如getD()+1);
}
其他的
{
组。put(curr,curr);
}
}

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

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);
   }
}
O类{
INTA、b、c;
布尔等于(对象o){/*您的代码*/}
int hashCode(){/*您的代码*/}
}
Map Map=newhashmap();
对于(O对象:O集合){
if(映射包含(对象)){
map.put(obj,map.get(obj)+1);
}否则{
地图放置(obj,1);
}
}

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

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

由于您没有定义可以使用的库的限制,让我向您介绍接口:

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


不,可以通过HashSet显示您的代码吗?我认为HashMap很适合,为什么不使用它?不清楚,为什么您不能从HashSet获取项目。只是简单回顾一下,以及我是否正确理解了这个问题。你想要私有get方法的HashMap吗?是的,这几乎就是我的解决方案。只有O类有4个变量int a,b,c,d;是的,但是我的意思是你不需要
d
,你可以用HashMap来做计数。如果你想要,你仍然可以有
d
,但是地图构建不再需要它。是的,我不需要d来完成这个任务,但它是其他东西的先决条件,所以对象必须是那样。当然你仍然可以包含它。只是不要在hashcode方法中使用它
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);
   }
}