我正在尝试根据其值来对哈希图进行排序,
我这样做的方法是将hashmap的keyset和valueset分成两个arrayList ,然后单独排序列表,然后在一些比较操作后在新的haspMap中添加值 但由于某种原因,collection.reverse(LIST),不按降序排列列表
这是我的代码:
public LinkedHashMap sortHashMapByValuesD(HashMap passedMap)
{
ArrayList <Integer>mapKeys = new ArrayList<Integer>(passedMap.keySet());
ArrayList <Double>mapValues= new ArrayList<Double>(passedMap.values());
Collections.reverse(mapValues);
Collections.reverse(mapKeys); //>>**Here the list won't sort for some reason**
LinkedHashMap<Integer, Double> sortedMap = new LinkedHashMap<Integer, Double>();
Iterator valueIt = mapValues.iterator();
while (valueIt.hasNext()) {
Object val = valueIt.next();
//System.out.println(val);
Iterator keyIt = mapKeys.iterator();
while (keyIt.hasNext()) {
Object key = keyIt.next();
Double comp1 =(Double)passedMap.get(key);
Double comp2 = (Double)val;
if (comp1==comp2){
passedMap.remove(key);
mapKeys.remove(key);
sortedMap.put((Integer)key,(Double)val);
break;
}
}
}
return sortedMap;
}
提前致谢
答案 0 :(得分:1)
HashMaps are hashed,未排序。特别是,HashMap<K, V>
未实现SortedMap<K, V>
接口。如果您想要按键排序的地图,请尝试TreeMap
或SortedMap
的任何其他实现。
按索引排序的地图通常不会被请求,也不会在rt.jar中直接支持。您甚至无法调用它们SortedMaps
,因为按值排序的地图(几乎)肯定不按键排序。虽然您可以实现按值排序的映射,但您可能会发现稍微不同的方法符合该法案,同时坚持使用java集合框架的语言。尝试创建一个支持地图的集合或迭代器,它提供您需要的顺序,并使用原始的HashMap作为其存储。
更简单的解决方案是
Set<Double> sortedSet = new TreeSet<Double>(yourPreferredComparator);
sortedSet.addAll(passedMap.values());
但是,使用此解决方案会丢失任何重复的值。