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对象有一个现场工作人员,我需要计算多次出现的员工.
我可以通过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)
我认为这是一个很好的方式:
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)
但您仍然无法检索实际的密钥。但这还不是最重要的,对吧?