使用Java8中的多个键排序地图列表
我有地图列表,我想使用键排列列表中的地图。截至目前,我实现这个使用下面的方法Collections.sort
..使用Java8中的多个键排序地图列表
Collections.sort(listOfMaps, new Comparator<Map<String, String>>() {
@Override
public int compare(Map<String, String> o1, Map<String, String> o2) {
//return o1.get("cm_order_x").compareTo(o2.get("cm_order_x"));
String x1 = o1.get(Key1);
String x2 = o2.get(Key1);
String x3 = o1.get(Key2);
String x4 = o2.get(Key2);
int sComp = x1.compareTo(x2);
int sComp1 = x3.compareTo(x4);
if (sComp != 0) {
return sComp;
}
else if(sComp1 != 0) {
//return x3.compareTo(x4);
return sComp1;
}
else
{
String x5 = o1.get(Key3);
String x6 = o2.get(Key3);
return x5.compareTo(x6);
}
}
});
是否有其他更好的方法在Java 8中maps
的list
排序?
由于Java8的Comparator
接口提供的工厂方法和链接方法:
Comparator<Map<String, String>> c
= Comparator.comparing((Map<String, String> m) -> m.get(Key1))
.thenComparing(m -> m.get(Key2))
.thenComparing(m -> m.get(Key3))
.thenComparing(m -> m.get(Key4));
listOfMaps.sort(c);
我相信你可以使用这样的代码完成这个任务:
listOfMaps.sort(Comparator.comparing(
m -> m.get("yourKey"),
Comparator.nullsLast(Comparator.naturalOrder()))
)
参见:How can I sort a list of maps using Java 8?
我看到这个线程,它是单键。如果有多个键可以排序呢? –
让我确定我理解你的问题。你是否想遍历ArrayList并按键对每个单独的HashMap进行排序?还是你想让一个HashMap包含每个HashMap中的所有键和值,按键排序? – broxhouse
有没有这种可能性,因为你是根据东西分拣只有你自己知道。
我的意思是,你首先由Key1
比较,然后Key2
等按键不是在地图编号,在这里Key1
并不意味着first key
,但some key that you want compared first
。没有办法告诉java,这种行为太具体了。
你可以想出一些通用的解决方案(比如更多按键的地图,所以你不必像这样列出),但是你不能避免这个实现的主要问题。
作为一种风格的东西,这些变量并不是真正的伟大的名字。他们没有什么可以表明'x1'和'x2'是相关的,但是'x2'和'x3'不是。我鼓励你不要害怕“长”的名字:例如'String key1FromO1 = o1.get(Key1)'。 – yshavit
感谢您的建议@yshavit。我会牢记这一点。 –