我有一个简单的类,它填写了一个简单的hashmap,我想通过hashcode对这些值进行排序怎么做?
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Ch11Ex18 {
public static void main(String[] args) {
Random rand = new Random(47);
Map<Integer,Integer> m = new HashMap<Integer,Integer>();
for(int i = 0; i < 10000; i++) {
// Produce a number between 0 and 20:
int r = rand.nextInt(20);
Integer freq = m.get(r);
m.put(r, freq == null ? 1 : freq + 1);
}
System.out.println(m);
}
}
答案 0 :(得分:3)
你没有:HashMap
本质上是无序的。
您可以将TreeMap
与自定义比较器一起使用,但是您应该知道,如果您使用具有相同哈希码的不等对象,那么其中只有一个会在地图中结束......甚至如此这可以通过键而不是值来排序。
您可以创建一个包含值副本的ArrayList<Integer>
,并将排序 - 但是您将无法获得密钥。
您可以创建一个包含条目副本的ArrayList<Map.Entry<Integer, Integer>>
,并对其进行排序......但实际上,重点是什么?
从根本上说,这是一个奇怪的事情 - 基本上,哈希码应该不这样使用。它们不是唯一的,不应该被视为随机性的来源,等等。无论这里的大局如何,几乎必然会有更好的方法。
答案 1 :(得分:2)
TreeMap按键排序。
Map yourMap= new HashMap();
// Enter values
Map sortedMap = new TreeMap(yourMap);
答案 2 :(得分:2)
在您的情况下,由于Integer.hashCode()
等于实际数字,您只需将映射插入TreeMap
,它们就会相应地进行排序。
答案 3 :(得分:1)
HashMap的迭代顺序是键的哈希码的自然排序(因为哈希值决定了桶,桶是按顺序迭代的),所以你可以迭代map.keySet()
。对于键类型Integer,哈希码等于Integer的实际值。