如何在Java中通过键sortingMap值

我有一个地图在Java中有两个string。

数据如下: <"question1", "1">, <"question9", "1">, <"question2", "4">, <"question5", "2">

我想根据它的键对地图进行sorting。 所以最后我会有question1, question2, question3 …等等。

最终我试图从这个地图中得到两个string。 第一个string:问题(依次为1..10)和第二个string:Answers(与问题的顺序相同)。

现在我有以下几点:

 Iterator it = paramMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry pairs = (Map.Entry)it.next(); questionAnswers += pairs.getKey()+","; } 

这让我的问题在一个string,但他们不是为了…

简短的回答

使用一个TreeMap 。 这正是它的目的。

如果这张地图传递给你,你不能确定types,那么你可以做到以下几点:

 SortedSet<String> keys = new TreeSet<String>(map.keySet()); for (String key : keys) { String value = map.get(key); // do something } 

这将按照键的自然顺序在地图上进行迭代。


较长的答案

从技术上讲,你可以使用任何实现SortedMap东西,除了极less数情况下,这相当于TreeMap ,就像使用Map实现一般相当于HashMap

如果你的键是一个复杂的types,没有实现Comparable,或者你不想使用自然的顺序,那么TreeMapTreeSet就有了额外的构造函数,可以让你传入一个Comparator

 // placed inline for the demonstration, but doesn't have to be an anonymous class Comparator<Foo> comparator = new Comparator<Foo>() { public int compare(Foo o1, Foo o2) { ... } } SortedSet<Foo> keys = new TreeSet<Foo>(comparator); keys.addAll(map.keySet()); 

请记住,使用TreeMapTreeSet ,它将具有不同于HashMapHashSet性能特性。 粗略地说,查找或插入元素的操作将从O(1)O(Log(N))

HashMap ,从1000个项目移动到10,000个并不会真正影响查找元素的时间,但是对于TreeMap ,查找时间将会减慢大约3倍(假设为Log 2 )。 从1000到100,000的search速度将比每个元素查找慢6倍左右。

假设TreeMap不适合你(假设你不能使用generics):

 List sortedKeys=new ArrayList(yourMap.keySet()); Collections.sort(sortedKeys); // Do what you need with sortedKeys. 

使用TreeMap可以对Map进行sorting。

 Map<String, String> map = new HashMap<String, String>(); Map<String, String> treeMap = new TreeMap<String, String>(map); for (String str : treeMap.keySet()) { System.out.println(str); } 

使用TreeMap !

如果你已经有了地图,并想按键sorting,只需使用:

 Map<String, String> treeMap = new TreeMap<String, String>(yourMap); 

一个完整的工作示例:

 import java.util.HashMap; import java.util.Set; import java.util.Map; import java.util.TreeMap; import java.util.Iterator; class SortOnKey { public static void main(String[] args) { HashMap<String,String> hm = new HashMap<String,String>(); hm.put("3","three"); hm.put("1","one"); hm.put("4","four"); hm.put("2","two"); printMap(hm); Map<String, String> treeMap = new TreeMap<String, String>(hm); printMap(treeMap); }//main public static void printMap(Map<String,String> map) { Set s = map.entrySet(); Iterator it = s.iterator(); while ( it.hasNext() ) { Map.Entry entry = (Map.Entry) it.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println(key + " => " + value); }//while System.out.println("========================"); }//printMap }//class 

只要使用TreeMap

 new TreeMap<String, String>(unsortMap); 

假设你不能使用TreeMap ,在Java 8中我们可以使用Collectors的toMap()方法,它需要以下参数:

  • keymapper :映射函数来生成密钥
  • valuemapper :映射函数来产生值
  • mergeFunction :合并函数,用于解决与同一个键关联的值之间的冲突
  • mapSupplier :一个返回结果将被插入的新的空Map的函数。

Java 8示例

 Map<String,String> sample = new HashMap<>(); // push some values to map Map<String, String> newMapSortedByKey = sample.entrySet().stream() .sorted(Map.Entry.<String,String>comparingByKey().reversed()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); Map<String, String> newMapSortedByValue = sample.entrySet().stream() .sorted(Map.Entry.<String,String>comparingByValue().reversed()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new)); 

我们可以修改这个例子来使用自定义比较器,并根据键进行sorting:

 Map<String, String> newMapSortedByKey = sample.entrySet().stream() .sorted((e1,e2) -> e1.getKey().compareTo(e2.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new)); 

此代码可以按照两个顺序(即,升序和降序)对键值映射进行sorting。

 <K, V extends Comparable<V>> Map<K, V> sortByValues (final Map<K, V> map, int ascending) { Comparator<K> valueComparator = new Comparator<K>() { private int ascending; public int compare(K k1, K k2) { int compare = map.get(k2).compareTo(map.get(k1)); if (compare == 0) return 1; else return ascending*compare; } public Comparator<K> setParam(int ascending) { this.ascending = ascending; return this; } }.setParam(ascending); Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); sortedByValues.putAll(map); return sortedByValues; } 

举个例子:

 Map<Integer,Double> recommWarrVals = new HashMap<Integer,Double>(); recommWarrVals = sortByValues(recommWarrVals, 1); // Ascending order recommWarrVals = sortByValues(recommWarrVals,-1); // Descending order 
 List<String> list = new ArrayList<String>(); Map<String, String> map = new HashMap<String, String>(); for (String str : map.keySet()) { list.add(str); } Collections.sort(list); for (String str : list) { System.out.println(str); } 

我们也可以使用Arrays.sort方法对键进行sorting。

 Map<String, String> map = new HashMap<String, String>(); Object[] objArr = new Object[map.size()]; for (int i = 0; i < map.size(); i++) { objArr[i] = map.get(i); } Arrays.sort(objArr); for (Object str : objArr) { System.out.println(str); }