查找具有最高出现次数的地图值

时间:2014-04-24 09:05:06

标签: java map

我有Map<Integer,Integer>

 1 10
 2 10
 3 20
 5 20
 6 11
 7 22

如何找到地图的最大重复值?在这种情况下 - 即10&amp; 20.两种情况下重复计数均为2。

5 个答案:

答案 0 :(得分:7)

不要重新发明方向盘并使用frequency类的Collections方法:

public static int frequency(Collection<?> c, Object o)

如果您需要计算所有值的出现次数,请使用Map并巧妙地循环:) 或者使用上面的frequency方法将值放在Set的每个元素的Set和循环中。 HTH

如果您喜欢使用lambdas的功能更强大的Java 8单行解决方案,请尝试:

Map<Integer, Long> occurrences = 
  map.values().stream().collect(Collectors.groupingBy(w -> w, Collectors.counting()));

答案 1 :(得分:2)

遍历hashmap,并计算重复次数。

for(Integer value:myMap.values() ){
  Integer count = 1;
  if(countMap.contains(value)){
    count = countMap.get(value);
    count++;
  }

  countMap.put(value, count);
}

然后遍历结果图,找到max(s):

Integer maxValue=0;
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()){
  if(entry.getValue => maxValue){
    maxValue = entry.getValue;
    maxResultList.add(entry.Key);
  }
}

答案 2 :(得分:0)

简单的解决方案是你需要编写自己的put方法来获取重复值

重复值

put(String x, int i){
    List<Integer> list = map.get(x);
    if(list == null){
        list = new ArrayList<Integer>();
        map.put(x, list);
    }
    list.add(i);

}

因此,在这种情况下,请映射到[10,10,20,20]

列表

用于重复出现值

您需要将值列表的大小与您设置的值进行比较。

List<T> listOfValues= map.values();
Set<T> listOfSetValues= new HashSet<T>(map.values);

现在你需要检查两个集合的大小;如果不相等,则有重复项,以从地图大小中获取最大重复出现减去列表。

答案 3 :(得分:0)

我们可以使用许多简单的方法来做到这一点。

首先,我们可以定义一个计算元素的方法,并将值从该值返回到其出现次数:

Map<T, Integer> countAll(Collection<T> c){
    return c.stream().collect(groupingByConcurrent(k->k, Collectors.counting()));
}

然后,要过滤掉所有具有最少的实例的条目,我们可以这样做:

C maxima(Collection<T> c, Comparator<? super T> comp,
            Producer<C extends Collection<? super T> p)){

    T max = c.stream().max(comp);
    return c.stream().filter(t-> (comp.compare(t,max) >= 0)).collect(p);
}

现在我们可以一起使用它们来获得我们想要的结果:

maxima(countAll(yourMap.valueSet()).entrySet(),
        Comparator.comparing(e->e.getValue()), HashSet::new);

请注意,这样会产生HashSet<Entry<Integer,Integer>>

答案 4 :(得分:0)

尝试这个简单的方法:

 public String getMapKeyWithHighestValue(HashMap<String, Integer> map) {
String keyWithHighestVal = "";

// getting the maximum value in the Hashmap
int maxValueInMap = (Collections.max(map.values()));

//iterate through the map to get the key that corresponds to the maximum value in the Hashmap
for (Map.Entry<String, Integer> entry : map.entrySet()) {  // Iterate through hashmap
    if (entry.getValue() == maxValueInMap) {

        keyWithHighestVal = entry.getKey();     // this is the key which has the max value
    }

  }
return keyWithHighestVal;
}