我有地图 Map<Type, Long> countByType,我想有一个列表,其中已经排序(最小到最大)的关键字根据他们的相应值。我的尝试是:
Map<Type, Long> countByType
countByType.entrySet().stream().sorted().collect(Collectors.toList());
然而,这只是给了我一个条目列表,我怎样才能得到一个类型列表,而不会丢失顺序?
必须根据条目的值使用自定义比较器进行排序。然后在收集之前选择所有的键
countByType.entrySet() .stream() .sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator .map(e -> e.getKey()) .collect(Collectors.toList());
您说希望按值排序,但是在代码中没有这个功能。向 sorted传递一个 lambda (或方法引用)来告诉它您想如何排序。
sorted
并且您希望获得键; 使用 map将条目转换为键。
map
List<Type> types = countByType.entrySet().stream() .sorted(Comparator.comparing(Map.Entry::getValue)) .map(Map.Entry::getKey) .collect(Collectors.toList());
您可以按照下面的值对映射进行排序,更多的例子是 给你
//Sort a Map by their Value. Map<Integer, String> random = new HashMap<Integer, String>(); random.put(1,"z"); random.put(6,"k"); random.put(5,"a"); random.put(3,"f"); random.put(9,"c"); Map<Integer, String> sortedMap = random.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
下面是使用 StreamEx的简单解决方案
EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();
Map<Integer, String> map = new HashMap<>(); map.put(1, "B"); map.put(2, "C"); map.put(3, "D"); map.put(4, "A"); List<String> list = map.values() .stream() .sorted() .collect(Collectors.toList());
输出: [A, B, C, D]
[A, B, C, D]
你可以用这个例子来说明你的问题
Map<Integer, String> map = new HashMap<>(); map.put(10, "apple"); map.put(20, "orange"); map.put(30, "banana"); map.put(40, "watermelon"); map.put(50, "dragonfruit"); // split a map into 2 List List<Integer> resultSortedKey = new ArrayList<>(); List<String> resultValues = map.entrySet().stream() //sort a Map by key and stored in resultSortedKey .sorted(Map.Entry.<Integer, String>comparingByKey().reversed()) .peek(e -> resultSortedKey.add(e.getKey())) .map(x -> x.getValue()) // filter banana and return it to resultValues .filter(x -> !"banana".equalsIgnoreCase(x)) .collect(Collectors.toList()); resultSortedKey.forEach(System.out::println); resultValues.forEach(System.out::println);