如何按整数值对哈希图进行排序[重复]

Posted

技术标签:

【中文标题】如何按整数值对哈希图进行排序[重复]【英文标题】:How to sort a hashmap by the Integer Value [duplicate] 【发布时间】:2014-01-30 00:32:04 【问题描述】:
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

我找不到任何关于按值降序的信息。 如何做到这一点? (不喜欢加班)

【问题讨论】:

你不能。但是您可以按值对 Entries (在列表或其他有序集合中一次)进行排序:开始,List entries = new ArrayList&lt;Entry&lt;String,Integer&gt;&gt;(hash.getEntries());然后排序。 @RC 这不是同一个问题.. (虽然我相信这是一个“重复”,但在另一个问题中接受的答案非常可怕 - 阅读所有回复。我还建议使用 [Array]List vs LinkedHashMap 作为输出集合。) @GameDevGuru:是的,除了一些细微的差别(地图值是字符串而不是整数)。特别阅读this answer。你也可以看看这个问题:***.com/questions/109383/… 我想要一百万美元。不,赚一千万。 【参考方案1】:

试试这个:

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

【讨论】:

这会将键、值对作为单个对象放入数组中,我需要能够在排序后分别检索键、值 它把 Map.Entry 你可以从中分别提取键和值,见 upate【参考方案2】:

您不能明确地对 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;
    
);

【讨论】:

我相信OP希望将键和值放在一起,但是使用结果。 这将键与值分开,没有想要的结果.. 这是真的,我认为他正在将它们打印出来或其他什么,所以他所要做的就是创建一个调用 map.getKey(value) 并返回一个字符串的方法......或任何他需要的东西。【参考方案3】:

Hash 元素的一个特点是它们在执行诸如添加、删除等操作时速度特别快,而这正是因为它们使用 Hash 算法,这意味着它们不会保持元素的顺序我们知道作为上升或下降。这意味着使用 Hash 数据结构将无法实现您想要的。

【讨论】:

这将是一个非常好的建议,但它并不能回答问题。 与其说不可能,不如建议先将其转换为ArrayList .. @user2864740 List intList = new ArrayList(map); ,然后使用列表。或类似的东西。 @GameDevGuru 但这根本不是演员阵容!对于 Java 中的所有类型转换,其中 x 是符合 T 的引用类型:((T)x) == x 为真。 @user2864740 我使用了错误的术语,对于造成的混乱,我深表歉意,但我想你知道我的意思。

以上是关于如何按整数值对哈希图进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Haskell - 按整数值对带有字符串的列表进行排序的函数

Numpy:如何按整数值缩放整数数组?

SQL按整数值的连续范围分组

如何按前缀整数值对 ArrayList<String> 进行排序[重复]

在编辑器中对枚举项进行排序

如何将哈希图转换为条目数组[重复]