我有一个地图,有字符串的键和值。
数据如下所示:
“问题1”,“1”
“question9”、“1”
“问题2”、“4”
“问题5”、“2”
我想根据键对映射进行排序。所以,最后,我将得到问题1,问题2,问题3,等等。
最终,我试图从这个Map中得到两个字符串:
第一串:问题(按顺序1 ..10)
第二串:答案(与问题顺序相同)
现在我有以下内容:
Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
questionAnswers += pairs.getKey() + ",";
}
这让我得到了一个字符串中的问题,但它们不是按顺序排列的。
如果你已经有了一个地图,想要按键排序,只需使用:
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,在Java 8中,我们可以使用collector中的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));
我们可以修改这个例子,使用自定义比较器,并根据键进行排序:
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));