假设我有一系列字符串,如:
1000
2000
100
200
20
10
我如何订购它们,以便数字排序第一位,但它是最长的?
e.g。
1000
100
10
2000
200
20
(这可能是微不足道的,但我想不出任何事情)。
答案 0 :(得分:5)
实施一个比较器,首先对第一个数字进行排序,然后按长度反向排序。
在Java 8 +中:
Comparator<String> yourComparator =
Comparator.comparing((String s) -> s.charAt(0))
.thenComparing(
Comparator.comparing(String::length).reversed());
如果你仍处于黑暗时代,你可以明确地实现这一点:
Comparator<String> yeOldeComparator = new Comparator<String>() {
@Override public int compare(String a, String b) {
int cmpFirst = Integer.compare(a.charAt(0), b.charAt(0));
if (cmpFirst != 0) return cmpFirst;
return Integer.compare(b.length(), a.length());
}
};
请注意,这些都不会处理空(或空)字符串。
在回复Patrick Parker's评论时,如果输入的长度相同且以相同的字符开头,您可能需要添加进一步的排序以确保订单稳定。
在Java 8案例中:
// ... As above, but add this before the semicolon:
.thenComparing(naturalOrder());
在Java 8之前的案例中:
// Replace return Integer.compare with:
int cmpLength = Integer.compare(b.length(), a.length());
if (cmpLength != 0) return cmpLength;
return a.compareTo(b);