使用Java 1.8,我会使用新的Comparator方法(尽管缺少Type推理使得必须声明所有类型,从而减少了lisibility):
final Comparator>> nameThenCountComparator = Comparator.>, Comparable> comparing(
m -> m.get("name")).thenComparing(Comparator.>, Comparable> comparing(
m -> m.get("count")));
使用Java 1.7,我可能会使用chainedComparator(参见Apache的ComparatorUtils或Guava的Ordering)和一个自定义的MapValueComparator(可能有一个在公共库中,但还没有找到它).然后想要的订单变得非常可读:
class MapValueComparator implements Comparator> {
private final String key;
public MapValueComparator(final String key) {
this.key = key;
}
@Override
public int compare(final Map o1, final Map o2) {
return ((Comparable)o1.get(key)).compareTo(o2.get(key));
}
}
Comparator nameThenCountComparator = ComparatorUtils.chainedComparator(
new MapValueComparator("name"),
new MapValueComparator("count")
);
然后使用它(Java 7或8):
final List>> list = null;
Collections.sort(list, nameThenCountComparator);
Rq:您应该像其他答案中所述,检查MapValueComparator中是否存在空值和缺少键.