数字顺序,但最长的数字首先

时间:2017-03-23 15:22:41

标签: java string sorting

假设我有一系列字符串,如:

1000
2000
100
200
20
10

我如何订购它们,以便数字排序第一位,但它是最长的?

e.g。

1000
100
10
2000
200
20

(这可能是微不足道的,但我想不出任何事情)。

1 个答案:

答案 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);