如何按照整数值对哈希映射进行排序

15
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("a", 4);
map.put("c", 6);
map.put("b", 2);

期望的输出(HashMap):

c : 6
a : 4
b : 2

我还没有找到有关按值降序排列的内容。
如何实现这一点?(不希望使用额外的类)


1
你不能这样做。但是你可以通过值对Entries(一旦在列表或其他有序集合中)进行排序:首先,List entries = new ArrayList<Entry<String,Integer>>(hash.getEntries()); 然后对其进行排序。 - user2864740
1
虽然我认为这是一个“重复”的问题,但另一个问题的答案相当糟糕——请仔细阅读所有的回答。我还建议使用[Array]List而不是LinkedHashMap作为输出集合。 - user2864740
1
@GameDevGuru:是的,除了一些微不足道的差异(例如地图值为字符串而不是整数),它们是相同的。特别是阅读这个答案。您还可以查看这个问题:https://dev59.com/qXVD5IYBdhLWcg3wDG_m - Jonik
@Jonik,你可以回答一些有建设性的内容,而不是链接到结果不良的帖子吗?谢谢。 - GameDevGuru
@user2864740 谢谢,我也在考虑同样的想法。如果有代码示例会非常有帮助。 - GameDevGuru
显示剩余5条评论
3个回答

31

试试这个:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 4);
map.put("c", 6);
map.put("b", 2);
Object[] a = map.entrySet().toArray();
Arrays.sort(a, new Comparator() {
    public int compare(Object o1, Object o2) {
        return ((Map.Entry<String, Integer>) o2).getValue()
                   .compareTo(((Map.Entry<String, Integer>) o1).getValue());
    }
});
for (Object e : a) {
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : "
            + ((Map.Entry<String, Integer>) e).getValue());
}

输出:

c : 6
a : 4
b : 2

这将键值对作为单个对象放入数组中,我需要在排序后能够分别检索键和值。 - GameDevGuru
它使用Map.Entry,您可以分别提取键和值,请参见更新。 - Evgeniy Dorofeev

4
您无法直接对HashMap进行排序,但可以对其条目进行排序。也许下面的方法可以帮助您实现这一点:
// not yet sorted
List<Integer> intList = new ArrayList<Integer>(map.values());

Collections.sort(intList, new Comparator<Integer>() {

    public int compare(Integer o1, Integer o2) {
        // for descending order
        return o2 - o1;
    }
});

我相信原帖的意思是希望在任何使用结果的情况下将键和值放在一起。 - user2864740
1
这将键与值分开,但没有达到预期的结果。 - GameDevGuru
这是真的,我想他可能会将它们打印出来,然后他只需要创建一个调用map.getKey(value)并返回字符串或其他所需内容的方法。 - Joseph Martin

0

Hash元素的一个特点是它们在执行添加、删除等操作时的特别速度,这正是因为它们使用哈希算法,这意味着它们不保留我们所知道的升序或降序的元素顺序。这意味着使用Hash数据结构无法达到您想要的效果。


2
这是一个非常好的建议,但它并没有回答问题。 - Ashish
不要说这是不可能的,不如建议先将它转换为ArrayList。 - GameDevGuru
@user2864740 可以使用List<String, Integer> intList = new ArrayList<String,Integer>(map);创建一个列表,然后对该列表进行操作。或者采用类似的方式。 - GameDevGuru
@GameDevGuru 但这根本不是一个强制转换!对于Java中的所有强制转换,其中x是符合T的引用类型:((T)x) == x是正确的。 - user2864740
@user2864740,我使用了错误的术语,对混淆感到抱歉,但我认为你知道我的意思。 - GameDevGuru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接