繁体   English   中英

如何在Java中按值(ArrayList)大小对地图排序?

[英]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
  }
};

然后仅使用此处概述的解决方案。

我在这里看到三个选择:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM