java - 数字顺序,但最长的数字在前

标签 java string sorting

假设我有一个字符串数组,例如:

1000
2000
100
200
20
10

如何对它们进行排序,以便第一个数字按数字顺序排序,但它是最长的第一个数字?

例如

1000
100
10
2000
200
20

(这可能是微不足道的,但我就是想不出任何东西)。

最佳答案

实现一个比较器,首先对第一个数字进行排序,然后对长度进行反向排序。

在 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());
  }
};

请注意,它们都不处理空(或 null)字符串。

<小时/>

回应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);

关于java - 数字顺序,但最长的数字在前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42980293/

相关文章:

Java-错误 : Actual and formal argument lists differ in length

java - 这两种冒泡排序算法有什么区别?

java - 基于另一个列表的 1 个列表的流过滤器

java - 加密对话

java - 如何在 CDI 环境中设置 Spring Data 的自定义行为

java - String.matches() 的 DOTALL

python - 如果项目不以给定模式结尾则打印项目

string - 如何转置字符串数组

java - 如何按除第一个字母以外的所有内容对字符串数组进行排序

algorithm - 如何知道排序算法何时完成?