[英]How to sort a Map by Value (ArrayList) size in Java?
我有以下地图:
Map<String, List<String>> map = new HashMap<String, List<String>>();
其中填充有成对的键和值。
例如:键=学生姓名,值=家庭成员姓名。
我想按字符串列表的大小对地图进行排序。 我曾尝试用TreeMap实现Comparator,但遇到错误,所以我切换回HashMap。 有任何想法吗?
您应该无序使用HashMap,然后每次要进行排序时,都要使用HashMap作为变量的Comparator将HashMap的所有值放入TreeMap中。
然后,对于您比较的每个键,您将获得HashMap的值(列表)并检查列表大小。 因此,您可以根据列表大小进行比较,并根据情况返回-1、0或1。
完成所需的操作后,将丢弃该TreeMap。
如果您尝试仅使用TreeMap,则会看到您正在根据不是该键属性的值对键进行排序。 在这种情况下,值的长度(列表)。 因此,可能存在增加列表长度的功能,并且TreeMap甚至不会注意到。
一些代码:
public class ListSizeComparator implements Comparator<String> {
private final Map<String, List<String>> map;
public ListSizeComparator(final Map<String, List<String>> map) {
this.map = map;
}
@Override
public int compare(String s1, String s2) {
//Here I assume both keys exist in the map.
List<String> list1 = this.map.get(s1);
List<String> list2 = this.map.get(s2);
Integer length1 = list1.size();
Integer length2 = list2.size();
return length1.compareTo(length2);
}
}
该解决方案与https://stackoverflow.com/a/8897384/869736大致相同,但是您所需要做的就是编写一个Comparator
,该Comparator
根据列表的长度比较列表。
Comparator<List<String>> lengthComparator = new Comparator<List<String>>() {
public int compare(List<String> a, List<String> b) {
return a.size() - b.size();
// size() is always nonnegative, so this won't have crazy overflow bugs
}
};
然后仅使用此处概述的解决方案。
我在这里看到三个选择:
TreeMap<Integer, List<String>>
(键-家庭成员数量,值-学生列表)。 TreeMap<Integer, Map<String, List<String>>>
(键-家庭成员数量,值-您原始地图的一部分包含家庭成员人数等于$ key的学生的地图)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.