我有以下地图:
Map<String, List<String>> map = new HashMap<String, List<String>>();
充满了成对的键和值 例如:key =学生姓名和值=家庭成员姓名 我想按字符串列表的大小对地图进行排序。我尝试用TreeMap实现Comparator,但是我收到了一个错误,所以我切换回HashMap。有什么想法吗?
答案 0 :(得分:3)
您应该使用无序的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);
}
}
答案 1 :(得分:2)
解决方案与https://stackoverflow.com/a/8897384/869736或多或少完全相同,但您只需编写一个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
}
};
然后只使用那里概述的解决方案。
答案 2 :(得分:0)
我在这里看到三个选择:
TreeMap<Integer, List<String>>
(键 - 家庭成员数,值 - 学生列表)。TreeMap<Integer, Map<String, List<String>>>
(关键字 - 家庭成员数量,值 - 原始地图的一部分,其中包含数量为家庭成员等于$ key)。