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

按值从高到低对Hashmap进行排序

魏勇军
2023-03-14

我试图排序的hashmap的结构的值从高到低。

我在下面创建了一个函数来对数据进行排序。

public static void SortDataHighToLow (Map <String, Integer> UnsortedMap){
    List <Integer> list = new ArrayList(UnsortedMap.keySet());
    Collections.sort(list,new Comparator <Integer>(){

        @Override
        public int compare(Integer arg0, Integer arg1) {

            return arg0-arg1;
        }
    });

    Map <String, Integer> sortedMap = new LinkedHashMap<>();

    for (Integer keys: list){
        sortedMap.put(UnsortedMap.toString(), keys);
    }

    System.out.println(sortedMap);
}

我收到以下错误:

异常在线程"main"java.lang.ClassCastException:类java.lang.String不能转换为类java.lang.整数(java.lang.String和java.lang.整数在加载器'bootstrap'的模块java.base)

我相信我的错误是由上面的for()引起的,我无法读取Key值。

我应该做什么调整?

谢谢你的帮助。

共有2个答案

戚均
2023-03-14

这是一个比较器,用于完成以下工作:

public class MapKeyByValueComparator<K, T> implements Comparator<K> {

    private final Map<K, T> map;

    private final Comparator<T> comparator;

    public MapKeyByValueComparator(Map<K, T> map, Comparator<T> comparator) {
        this.map = map;
        this.comparator = comparator;
    }

    @Override
    public int compare(K o1, K o2) {
        int ritem = comparator.compare(map.get(o1), map.get(o2));
        // CAN NOT RETURNS 0, otherwise key with the same value will be overridden
        if (ritem == 0) {
            ritem = 1;
        }
        return ritem;
    }

}

然后,您可以使用树状图作为:

Map<something, somethig> map = new TreeMap<>(comparator):
map.addAll(...);

但请注意,这破坏了可比的合同

强烈建议(尽管不是必需的)自然排序与equals一致。这是因为没有显式比较器的排序集(和排序映射)在与自然排序与equals不一致的元素(或键)一起使用时表现“奇怪”。特别是,这样的排序集(或排序映射)违反了根据equals方法定义的集合(或映射)的一般约定。

鲁望
2023-03-14

当@deHaar给出答案时,我的问题得到了解决。代码如下。

private static <K, V> Map<K, V> sortByValue(Map<K, V> map) {
List<Entry<K, V>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Object>() {
    @SuppressWarnings("unchecked")
    public int compare(Object o1, Object o2) {
        return ((Comparable<V>) ((Map.Entry<K, V>) (o1)).getValue()).compareTo(((Map.Entry<K, V>) (o2)).getValue());
    }
});

Map<K, V> result = new LinkedHashMap<>();
for (Iterator<Entry<K, V>> it = list.iterator(); it.hasNext();) {
    Map.Entry<K, V> entry = (Map.Entry<K, V>) it.next();
    result.put(entry.getKey(), entry.getValue());
}

return result;

}

 类似资料:
  • 问题内容: 我需要根据存储在其中的值对我进行排序。在包含存储在手机联系人的名字。 另外,我还要求在对值进行排序时对键进行自动排序,否则你可以说键和值绑定在一起,因此值的任何更改都应反映在键中。 要求的输出: 问题答案: 尝试下面的代码对我来说很好。你可以选择升序和降序 编辑:版本2 使用了新的Java功能,例如流for-each等 如果值相同,则地图将按键排序

  • 边走边学Java(Python背景)。简单的单词计数程序在Java7代码(不能用J8!)。 我有一个单词的哈希图:计数对。现在我需要按计数(递减顺序)排序,并打破按字母顺序使用word的联系。 我正在寻找对这个想法的反馈: 遍历HashMap中的映射项(me) 使用me.getkey=K和me.getvalue=v new map.entry reverse_me=(V,K){不确定此语法} 将r

  • 考虑下面的哈希图: 具有诸如 我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序: 到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?

  • 我有一个班的学生有以下领域: 字段“状态”可以有2个值:1。现在,2。缺席的 然后我有一个可观察的列表: 因此,我将学生存储在这个列表中。每个学生都有出席或缺席状态。 我需要按状态对这个观察列表进行排序。我希望目前状态的学生在该列表中名列第一。 有什么建议吗? 如果有任何帮助,我将不胜感激。

  • 我有一个HashMap,我试着按它的值(从大到小)排序。我想要一个新的Map对象,它是新排序的哈希映射的克隆(或者直接对哈希映射本身排序的方法)。以下是我的代码: 问题是输出是原始哈希图的输出,而不是排序哈希图的输出。如果有人能帮助我,将不胜感激! 编辑:我使用LinkedHashMap修改了当前代码。

  • 我想按值长度对Map进行排序。例如,我有这样的代码: 结果是: 所以我想做的是按值长度对这个Map进行排序,所以它返回: