1. 概述

本文将探讨几种按字符串长度对字符串数组进行排序的不同方法。这些方法适用于需要根据元素长度而非字典序排序的场景。

2. Comparator 基础

在 Java 中实现排序时,我们通常定义一个 Comparator 来指定元素间的比较规则。排序算法会应用这个 Comparator 生成的顺序来返回排序结果。

定义 Comparator 时需要实现以下方法

int compare(T o1, T o2);

根据 Java API 规范:

  • o1 小于 o2,返回负数
  • 若两者相等,返回 0
  • o1 大于 o2,返回正数

后续示例将使用这个未排序的字符串数组:

String[] inputArray = new String[] {"am", "today", "too", "I", "busy"};

按长度排序后的预期结果:

String[] SORTED = new String[] {"I", "am", "too", "busy", "today"};

3. 自定义 Comparator 实现

最基础的方式是创建一个自定义的字符串 Comparator,通过数值比较字符串长度

public class StringLengthComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}

调用 Arrays.sort() 时传入自定义 Comparator

@Test
void whenSortByCustomComparator_thenArraySorted() {
    StringLengthComparator comparator = new StringLengthComparator();
    Arrays.sort(inputArray, comparator);
    assertThat(inputArray).isEqualTo(SORTED);
}

对于一次性使用的场景,可以用匿名类简化:

@Test
void whenSortByInnerClassComparator_thenArraySorted() {
    Arrays.sort(inputArray, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return Integer.compare(s1.length(), s2.length());
        }
    });
    assertThat(inputArray).isEqualTo(SORTED);
}

4. Lambda 表达式实现

Java 8 引入的 lambda 表达式 可以进一步简化代码。Lambda 本质是可传递的匿名函数

直接将比较逻辑作为参数传递,无需定义额外类,代码更简洁:

@Test
void whenSortedByLambda_thenArraySorted() {
    Arrays.sort(inputArray, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
    assertThat(inputArray).isEqualTo(SORTED);
}

效果与前节相同,但代码更清爽。

5. 比较函数链式调用

Java 8 在 Comparator 类中新增了便捷的比较静态方法

这里适合使用 Comparator.comparingInt(),它接受一个返回整数的方法引用。示例中使用 String::length 获取字符串长度:

@Test
void whenSortedByComparingInt_thenArraySorted() {
    Arrays.sort(inputArray, Comparator.comparingInt(String::length));
    assertThat(inputArray).isEqualTo(SORTED);
}

✅ 语法更简洁,功能与前两种方式完全一致。

6. 总结

本文探讨了三种按字符串长度排序的实现方式,核心都是为 Arrays.sort() 提供专用的 Comparator

  1. 自定义 Comparator 类(适合复用场景)
  2. Lambda 表达式(简洁高效)
  3. **Comparator.comparingInt()**(最简洁的链式调用)

完整代码示例可在 GitHub 获取。实际开发中建议优先选择 Java 8+ 的函数式写法,代码更简洁易读。


原始标题:Sort an Array of Strings According to String Lengths | Baeldung