我正在使用Java 8按值代码对地图进行排序。
我已经完成了大多数事情,但是我没有得到如何使用Java 8功能将列表转换为地图的方法
public class SortMapByValue {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 3);
map.put("V", 1);
map.put("Anss", 9);
map.put("D", 5);
map.put("E", 2);
map.put("F", 10);
HashMap<String, Integer> newMap = new LinkedHashMap<>();
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, (o1, o2) -> o1.getValue() - o2.getValue());
// Need to this using Java 8 -- start
for (Entry<String, Integer> entry : list) {
newMap.put(entry.getKey(), entry.getValue());
}
// Need to this using Java 8 -- end
newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
}
}
答案 0 :(得分:5)
如果要基于值对Map
进行排序,请使用Entry.comparingByValue()
,然后将它们收集到LinkedHashMap
中:
Map<String,Integer> result = map.entrySet()
.stream()
.sorted(Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a,b) -> b, LinkedHashMap::new));
在Java-8中有3种重载的toMap
方法,上面的方法有4个参数,即
public static <T,K,U,M extends Map<K,U>> Collector<T,?,M> toMap(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier)
参数:
keyMapper-生成键的映射函数
valueMapper-用于生成值的映射函数
mergeFunction-合并函数,用于解决之间的冲突 与提供给Map.merge(Object,Object,BiFunction)的键相同的值
mapSupplier-返回新的空Map并将结果插入其中的函数
答案 1 :(得分:1)
Map map = list.stream().collect(
Collectors.toMap(
entry -> entry.getKey(), // keyMapper
entry -> entry.getValue(), // valueMapper
(first, second) -> first, // mergeFunction
() -> new LinkedHashMap<>() // mapFactory
)
);
请参见Stream和Collectors
您甚至可以这样做:
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 3);
map.put("V", 1);
map.put("Anss", 9);
map.put("D", 5);
map.put("E", 2);
map.put("F", 10);
Map newMap = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(
Collectors.toMap(
entry -> entry.getKey(), // keyMapper
entry -> entry.getValue(), // valueMapper
(first, second) -> first, // mergeFunction
() -> new LinkedHashMap<>() // mapFactory
)
);
newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
}