在List类型的值上对HashMap进行排序

时间:2014-11-03 20:47:25

标签: list sorting hashmap

我有一个地图,其中键为String,值为List,需要对值进行排序

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

其中List的大小为3,需要按照asc顺序对item1,item2和list3的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]

如何做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

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

当然,如果您不需要地图密钥,可以简化可怕的参数类型。

它会像这样(至少在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<List<Integer>> 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));
    }
});