我有一个由String
和相应的List
组成的Map
。列表大小不同:
Map<String, List<String>> map = new LinkedHashMap<>();
List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
List<String> l3 = new ArrayList<>();
l1.add("Str1");
l1.add("Str2");
l2.add("Str1");
l2.add("Str2");
l2.add("Str3");
l3.add("Str1");
map.put("Category A", l1);
map.put("Category B", l2);
map.put("Category C", l3);
我想按List
s的大小按降序对Map
的条目进行排序。所以在我的例子中,最终结果应该是:
Category B: Str1, Str2, Str3
Category A: Str1, Str2
Category C: Str1
我试着:
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
entry.getValue().sort(new Comparator<String>() {
public int compare(ArrayList a1, ArrayList a2) {
return a2.size() - a1.size();
}
});
但是我得到:
java: <anonymous com.app.class> is not abstract and does not override abstract method compare(java.lang.String,java.lang.String) in java.util.Comparator
您可以引入另一个Map<K,>(这样可以保留插入顺序,例如LinkedHashMap<K, V>
),并按照比较器规定的顺序在其中插入条目:
Map<String, List<String>> map = new LinkedHashMap<>();
List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
List<String> l3 = new ArrayList<>();
l1.add("Str1");
l1.add("Str2");
l2.add("Str1");
l2.add("Str2");
l2.add("Str3");
l3.add("Str1");
map.put("Category A", l1);
map.put("Category B", l2);
map.put("Category C", l3);
LinkedHashMap<String, List<String>> descByValues = new LinkedHashMap<>();
map.entrySet()
.stream()
.sorted((e1, e2) -> e2.getValue().size() - e1.getValue().size())
.forEachOrdered(x -> descByValues.put(x.getKey(), x.getValue()));
然后:
descByValues
.forEach((k, v) -> System.out.println(k + ", " + v));
将输出:
Category B, [Str1, Str2, Str3]
Category A, [Str1, Str2]
Category C, [Str1]
这不会做你想做的:
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
entry.getValue().sort(new Comparator<String>() {
public int compare(ArrayList a1, ArrayList a2) {
return a2.size() - a1.size();
}
});
你的错误是由于类型:
Map.Entry<String, List<String>> entry
这意味着entry.getValue()
返回一个List<String>
,而且List.sort(Comparator<T>)
只能与Comparator<String>
一起工作,因为T = String
.
如果你想按List的大小排序,你将不得不失去类别:
List<List<String>> list = new ArrayList<>(map.values());
list.sort((a1, a2) -> a2.size() - a1.size());
如果需要保持类别,则需要一个中间类型来保持映射:
List<Map.Entry<String, List<String>>> list = new ArrayList<>(map.entrySet());
list.sort((a1, a2) -> a2.getValue().size() - a1.getValue()..size());
请注意,我使用了List而不是修改Map:不是所有的Map都允许排序,而那些允许排序的(SortedMap)主要对键进行排序。