按列表的大小排序Map中的条目



我有一个由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);

我想按Lists的大小按降序对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)主要对键进行排序。

最新更新