Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。
并且,大家可以制定自己的排序规则。
按单个value排序:
import java.util.Collections;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map; import static java.util.Map.Entry.comparingByValue;import static java.util.stream.Collectors.toMap; public class SortTest { public static void main(String[] args) throws Exception { // 创建一个字符串为Key,数字为值的map Map budget = new HashMap<>(); budget.put("clothes", 120); budget.put("grocery", 150); budget.put("transportation", 100); budget.put("utility", 130); budget.put("rent", 1150); budget.put("miscellneous", 90); System.out.println("排序前: " + budget); // 按值排序 升序 Map sorted = budget .entrySet() .stream() .sorted(comparingByValue()) .collect( toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); System.out.println("升序按值排序后的map: " + sorted); // 按值排序降序 sorted = budget .entrySet() .stream() .sorted(Collections.reverseOrder(comparingByValue())) .collect( toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); System.out.println("降序按值排序后的map: " + sorted); } }
按多个value排序:
data = data.stream().sorted(Comparator.comparing(o -> { StringBuffer key = new StringBuffer(); fieldList.stream().forEach((a)-> { key.append(o.get(a)+""); }); return key.toString();} )).collect(Collectors.toList());
下面的代码中,首先按照value的数值从大到小进行排序,当value数值大小相同时,再按照key的长度从长到短进行排序,这个操作与Stream流式操作相结合。
public static LinkedHashMap sortMap(Map map) { return map.entrySet().stream().sorted(((item1, item2) -> { int compare = item2.getValue().compareTo(item1.getValue()); if (compare == 0) { if (item1.getKey().length() < item2.getKey().length()) { compare = 1; } else if (item1.getKey().length() > item2.getKey().length()) { compare = -1; } } return compare; })).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); }
来源地址:https://blog.csdn.net/weixin_44688973/article/details/128612150