【问题标题】:Sorting HashMap on values of type List根据 List 类型的值对 HashMap 进行排序
【发布时间】:2014-11-03 20:47:24
【问题描述】:

我有一张地图,其中键为字符串,值为列表,需要根据值对地图进行排序

HashMap<String, List<Integer>> data = new HashMap<String, List<Integer>>();

其中 List 的大小为 3,需要对 item1、item2 和 list 的 item3 进行升序排序

例如,如果我有一张像下面这样的地图

K1=[3, 1, 96], 
K2=[0, 4, 4], 
K3=[3, 2, 88], 
K4=[2, 2, 12], 
K5=[3, 3, 64], 
K6=[2, 4, 12], 
K7=[3, 4, 64], 
K8=[2, 1, 12], 
K9=[2, 3, 12],
K10=[1, 2, 33],
K11=[3, 1, 45],
K12=[1, 1, 12],
K13=[0, 1, 6],
K14=[0, 1, 3],
K15=[2, 1, 12],
K16=[3, 4, 22],

排序后:

K14=[0, 1, 3],
K13=[0, 1, 6],
K2=[0, 4, 4], 
K12=[1, 1, 12],
K10=[1, 2, 33],
K8=[2, 1, 12],
K15=[2, 1, 12],
K4=[2, 2, 12],
K9=[2, 3, 12],
K6=[2, 4, 12],
K11=[3, 1, 45],
K1=[3, 1, 96],
K3=[3, 2, 88],
K5=[3, 3, 64],
K16=[3, 4, 22],
K7=[3, 4, 64]

如何做到这一点?

谢谢

【问题讨论】:

  • How to sort a HashMap in Java 的可能重复项 - 另外值得一提的是,您无法对 HashMap 进行排序。这是一个地图,它没有排序顺序。这是一组没有顺序保证的值。
  • HashMap 和 TreeMap 都不能按值排序(HashMap 根本无法排序,TreeMap 只能按键排序),因此您必须将其传输到其他数据结构。您对数据结构有什么需求?
  • 我基本上有一个包含 4 个项目的列表 [id,type,value1,value2],我必须根据 type、value1 和 value2 对它们进行排序。如何做到最好
  • @user3008823 在这种情况下,请参阅我的更新答案。
  • 4 个项目的 id 是字符串,其余的是整数,它不是一个仅包含整数的列表

标签: list sorting hashmap


【解决方案1】:

我的建议是您将元素转移到List&lt;Map.Entry&lt;String, List&lt;Integer&gt;&gt;&gt;(例如通过调用new ArrayList&lt;&gt;(data.entrySet())),然后可以使用Comparator&lt;Map.Entry&lt;String, List&lt;Integer&gt;&gt;&gt; 对其进行排序。

如果您不需要映射键,当然可以简化可怕的参数类型。

它会变成这样(至少在 Java 8 中。Java 7 需要更多样板代码):

List<Map.Entry<String, List<Integer>>> dataList;
dataList = new ArrayList<>(data.entrySet());
dataList.sort((x, y) -> {
    int comparison = Integer.compare(x.getValue().get(0), y.getValue().get(0));
    if (comparison != 0) return comparison;
    comparison = Integer.compare(x.getValue().get(1), y.getValue().get(1));
    if (comparison != 0) return comparison;
    return Integer.compare(x.getValue().get(2), y.getValue().get(2));
});

编辑:如果您只想对List&lt;List&lt;Integer&gt;&gt; list 进行排序,它就这么简单(这次是 Java 7):

Collections.sort(list, new Comparator<List<Integer>>(){
    public int compare(List<Integer> a, List<Integer> b) {
        int comparison = a.get(0).compareTo(b.get(0));
        if (comparison != 0) return comparison;
        comparison = a.get(1).compareTo(b.get(1));
        if (comparison != 0) return comparison;
        return a.get(2).compareTo(b.get(2));
    }
});

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 2016-01-21
    • 1970-01-01
    • 2021-03-26
    • 2015-01-02
    • 2011-03-05
    • 2020-09-04
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多