我有一个地图,其中键为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]
如何做到这一点?
由于
答案 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));
}
});