How to sort a hashmap by the Integer Value
1 2 3 4
| HashMap <String,Integer > map = new HashMap <String,Integer >();
map. put("a", 4);
map. put("c", 6);
map. put("b", 2); |
所需输出(hashmap):
我找不到任何有关按值降序的信息。如何实现这一目标?(不首选额外课程)
- 不能,但可以按值对条目进行排序(一次在列表或其他已排序集合中):首先,List entries = new ArrayList>(hash.getEntries());然后对其进行排序。
- @这不是同一个问题。
- (虽然我认为这是一个"复制品",但另一个问题中的公认答案却是相当可怕的——仔细阅读所有答案。我还建议使用[array]列表与linkedhashmap作为输出集合。)
- @gamedevguru:是的,除了细微的差异(映射值是字符串而不是整数)。尤其要阅读这个答案。你也可以看看这个问题:stackoverflow.com/questions/109383/&hellip;
- 我要一百万美元。不,那就1000万吧。
- @乔尼克,你能不能用一些建设性的东西来回答,而不是链接到有不希望的结果的帖子?谢谢
- @用户2864740谢谢,我也有同样的想法。代码示例将有很大帮助。
- @gamedevguru如果您希望输出是一个列表(例如,立即使用),请参阅stackoverflow.com/a/13913206/2864740,然后跳过sortByComparator中的步骤,将排序后的数据放回*映射中。我可能也会使用arraylist作为impl。通过和通过以及比较器中的顺序条件可以移除。类型也必须更新一点。但同样的概念也应该适用。
- @Jonik感谢你在这篇文章中唯一有用的链接
- 如果整数=空怎么办?它是第一个还是最后一个?
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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());
} |
输出:
- 这将键、值对作为一个数组中的单个对象,我需要能够在排序后分别检索键、值。
- 它放置map.entry。您可以分别从中提取键和值,请参见upate。
不能对哈希图进行明确排序,但可以对条目进行排序。也许这样有助于:
1 2 3 4 5 6 7 8 9 10
| // 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)并返回一个字符串…或者他需要的任何东西的方法。
Hash元素的一个特点是它们在执行添加、删除等操作时的速度特别快,这正是因为它们使用散列算法,这意味着它们不保持我们所知的上升或下降元素的顺序。这意味着,使用Hash数据结构,您将无法实现所需的功能。
- 这将是一个非常好的建议记住,但它没有回答这个问题。
- 与其说这是不可能的,不如建议先把它列为一个数组列表。
- @user2864740 listintlist=new arraylist(map);,然后使用该列表。或是有这种效果的东西。
- @但那根本不是演员!对于Java中的所有强制转换,其中EDCOX1〔0〕是符合EDCOX1的引用类型,1〕:EDCOX1×2 }是真的。
- @用户2864740我使用了错误的术语,很抱歉弄错了,但我想你知道我的意思。