当前位置: 首页 > 知识库问答 >
问题:

在Java中,我需要根据哈希映射的值对其键进行分组

有骏奇
2023-03-14

我要找到最重要的钥匙。

Banana : 13  
Apple: 12  
Mango : 32  
Orange : 12  
Grape : 18  
Pear : 12  
Peach : 18  
private static <K extends Comparable, V extends Comparable> Map<K, V> sortByValues(Map<K, V> map) {
    List<Map.Entry<K, V>> entries = new LinkedList<Map.Entry<K, V>>(map.entrySet());

    Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {

        @Override
        public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
            return o2.getValue().compareTo(o1.getValue());
        }
    });
    Map<K, V> sortedMap = new LinkedHashMap<K, V>();
    for (Map.Entry<K, V> entry : entries) {
        sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}
Mango : 32  
Grape : 18  
Peach : 18  
Banana : 13  
Apple: 12  
Orange : 12  
Pear : 12  
Mango :32  
Grape, Peach : 18  
Banana :13  
Apple, Orange, Pear: 12  
int sizeOfMap = myValueSortedMap.size();
ArrayList<String> keyArr = new ArrayList<String>();
int cnt=0,keyVal=0;

while(cnt<(sizeOfMap-1)){

    if(myValueSortedMap.values().toArray()[cnt] == myValueSortedMap.values().toArray()[cnt+1]){

        keyArr.add((String) myValueSortedMap.keySet().toArray()[cnt]+ " , " +(String) myValueSortedMap.keySet().toArray()[cnt+1]);
    }
    else{
        keyArr.add((String) myValueSortedMap.keySet().toArray()[cnt]);
        keyVal = (int) myValueSortedMap.values().toArray()[cnt];
    }
    cnt++;
}

共有1个答案

高自怡
2023-03-14

您可以使用两步流处理--第一步按数值对条目进行分组,第二步对流内容进行排序,应用4的限制并打印结果。

map.entrySet()
   .stream()
   .collect(Collectors.groupingBy(Map.Entry::getValue))
   // the map now contains integers mapped to a list of map entries
   .entrySet()
   .stream()
   // sort the stream by descending numeric value
   .sorted((o1, o2) -> o2.getKey().compareTo(o1.getKey()))
   // use the first four elements of the stream
   .limit(4)
   .forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue().stream().map(Map.Entry::getKey).collect(Collectors.joining(", "))));

这导致

32 Mango
18 Grape, Peach
13 Banana
12 Apple, Pear, Orange
 类似资料:
  • 问题内容: 我有一个,我想找到每个值的键数 根据上面的帖子,我尝试了平面映射: 输出是 这意味着0有两个键,1有三个键,依此类推。现在,我想根据键的数量以降序对键和值进行排序。我尝试过这样的事情: 我想要以下输出: 键和值应根据此键的数量降序排列:1、2、3、4具有三个键,0和5具有两个键。 例如::1具有三个键,因此它首先出现:2和3具有三个键,而0仅具有两个键。 问题答案: 您可能具有以下内容

  • 我有一个带有键和值的哈希映射(整数数组)

  • Java流新手在这里。目前我正在完成本书中关于收集者的第6章(用流收集数据)。 我的对象是这样的。 这样做的目的是得到某种总体总结报告。基本上是一个HashMap 关键1: 投影-表示每个报告中所有投影的总和。 关键2: <代码>票据-表示每个报表中所有票据的总和。 关键3: 收入-表示每个报表的所有收入之和。 现在,我实际上通过创建自定义收集器来进行赋值,称为。 所以我得到的结果是这样的: 所以

  • 我有一个HashMap,其中类的对象(对象1,对象2,对象3)作为键,java.util.Date(日期1,日期2,日期3)作为值。HashMap已经根据值进行了排序,即基于日期对象。键对象具有名为name的属性。 现在,当HashMap的值相同时,即当值的日期相同时,我需要检查键对象的名称(obj.name),并根据键对象的名称属性对HashMap进行排序。请注意,只有当HasHMap和值的日期

  • 问题内容: 我有需要检查的情况。我有一个名为: 因为该键本身不存在,所以抛出。如果我检查 由于引发了另一个。如何测试地图中的键不存在?我知道该方法应该处理它,但这不在我的控制之下。] 问题答案: 即使现在我也因为.get引发异常而得到nullpoiner 如果只有一行,并且确定它抛出异常,则唯一的可能性可能是null。

  • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作: