如何在Java中获取HashMap的相同值多次出现次数?

Kin*_*ien 5 java hashmap map data-structures

有没有简单的方法来获取存在相同值的键?或者更重要的是,我怎样才能获得相同值多次出现的次数?

考虑一下hashmap:

1->A
2->A
3->A
4->B
5->C
6->D
7->D
Run Code Online (Sandbox Code Playgroud)

这里相同值多于一次发生3次(两次,D次一次).那是(3)我想要的回报.

我可以通过keyset/map.values()列表遍历hashmap,但这样做似乎相当麻烦.任何建议或解决方案?

编辑: 我的背景是,我正在研究时间表生成器.时隙的数据结构是

{String day-hour, HashMap<String,Event> Rooms}
Run Code Online (Sandbox Code Playgroud)

对于一天的工作时间,会在客房地图上指定一些事件.在检查解决方案的适用性时,我需要知道是否在同一时间为一名员工分配了多个事件.因此,我想通过值Event.getStaff()检查Rooms map中有多少违规.

编辑: 值是这里的对象,我不想计算相同对象的出现次数,而是计算对象的字段.EVENT对象有一个现场工作人员,我需要计算多次出现的员工.

Jon*_*eet 5

我可以通过keyset/map.values()列表遍历hashmap,但这样做似乎相当麻烦.

好吧效率很低,但是你没有太多可以做的,没有某种多映射来存储值到键的反向映射.

如果你使用Guava,它在代码方面不一定很麻烦:

Multiset<String> counts = HashMultiSet.create(map.values());
for (Multiset.Entry<String> entry : counts.entrySet) {
  if (entry.getCount() > 1) {
    System.out.println(entry.getElement() + ": " + entry.getCount());
  }
}
Run Code Online (Sandbox Code Playgroud)


mxn*_*xns 3

我认为这是一个很好的方式:

int freq = Collections.frequency(map.values(), "A");
Run Code Online (Sandbox Code Playgroud)

对于您的示例,它返回“3”。干杯!

编辑:抱歉,我在第一次尝试时误解了这个问题,这应该可以解决问题:

int k = 0;
Set<String> set = new HashSet<String>(map.values());
for (String s : set) {
   int i = Collections.frequency(map.values(), s);
   k += i > 1 ? i - 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

但您仍然无法检索实际的密钥。但这还不是最重要的,对吧?