如何在Java中按值(ArrayList)大小对Map进行排序?

时间:2012-01-25 19:21:10

标签: java list sorting map

我有以下地图:

    Map<String, List<String>> map = new HashMap<String, List<String>>();

充满了成对的键和值 例如:key =学生姓名和值=家庭成员姓名 我想按字符串列表的大小对地图进行排序。我尝试用TreeMap实现Comparator,但是我收到了一个错误,所以我切换回HashMap。有什么想法吗?

3 个答案:

答案 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)

我在这里看到三个选择:

  1. 每次需要时对地图内容进行排序 - 如果不经常这样就可以了。
  2. 除了地图存储其他具有所需顺序的辅助结构外,例如TreeMap<Integer, List<String>>(键 - 家庭成员数,值 - 学生列表)。
  3. 您可能根本不需要所描述的地图,并且以下地图就足够了:TreeMap<Integer, Map<String, List<String>>>(关键字 - 家庭成员数量,值 - 原始地图的一部分,其中包含数量为家庭成员等于$ key)。