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
:
- 自定义 Comparator 类(适合复用场景)
- Lambda 表达式(简洁高效)
- **Comparator.comparingInt()**(最简洁的链式调用)
完整代码示例可在 GitHub 获取。实际开发中建议优先选择 Java 8+ 的函数式写法,代码更简洁易读。