如何按整数值对哈希图进行排序[重复]
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<Entry<String,Integer>>(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 Listx
是符合 T
的引用类型:((T)x) == x
为真。
@user2864740 我使用了错误的术语,对于造成的混乱,我深表歉意,但我想你知道我的意思。以上是关于如何按整数值对哈希图进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Haskell - 按整数值对带有字符串的列表进行排序的函数