1. 概述
本文将介绍如何在 Java 中对字符串按字母顺序进行排序。
这种操作虽然看起来简单,但在某些场景下非常有用,比如判断两个单词是否由相同的字符组成,也就是我们常说的“回文构词法”(Anagram)检测。
2. 字符串排序方法
在 Java 中,String
内部是通过字符数组来存储数据的。因此我们可以借助 toCharArray()
方法将其转换为字符数组,排序后再重新构造一个新的字符串:
@Test
void givenString_whenSort_thenSorted() {
String abcd = "bdca";
char[] chars = abcd.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
assertThat(sorted).isEqualTo("abcd");
}
✅ 这是最直接的方式,适用于大多数情况。
而在 Java 8 及以后版本中,我们还可以使用 Stream API 来完成同样的任务:
@Test
void givenString_whenSortJava8_thenSorted() {
String sorted = "bdca".chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
assertThat(sorted).isEqualTo("abcd");
}
⚠️ 注意:字符是按照 ASCII 码值排序的,这意味着大写字母会排在小写字母前面。例如对 "abC"
排序的结果是 "Cab"
。
如果我们希望忽略大小写,可以先调用 toLowerCase()
方法处理原始字符串。下面的 Anagram 校验器示例中就会这么做。
3. 实战应用:Anagram 校验器
为了验证字符串排序的效果,我们来实现一个简单的 Anagram 校验器。
所谓 Anagram,就是两个词或句子由完全一样的字符组成,只是顺序不同,比如 "listen" 和 "silent"。
下面是我们的校验类:
public class AnagramValidator {
public static boolean isValid(String text, String anagram) {
text = prepare(text);
anagram = prepare(anagram);
String sortedText = sort(text);
String sortedAnagram = sort(anagram);
return sortedText.equals(sortedAnagram);
}
private static String sort(String text) {
char[] chars = prepare(text).toCharArray();
Arrays.sort(chars);
return new String(chars);
}
private static String prepare(String text) {
return text.toLowerCase()
.trim()
.replaceAll("\\s+", "");
}
}
然后我们编写测试用例:
@Test
void givenValidAnagrams_whenSorted_thenEqual() {
boolean isValidAnagram = AnagramValidator.isValid("Avida Dollars", "Salvador Dali");
assertTrue(isValidAnagram);
}
✅ 测试通过,说明排序逻辑和预处理都工作正常。
4. 小结
这篇文章展示了两种对字符串进行字母排序的方法,并基于此实现了一个实用的 Anagram 判断工具。
完整代码可以在 GitHub 项目中找到:GitHub 链接
📌 踩坑提醒:
- 默认排序区分大小写,注意根据需求决定是否统一转小写。
- 处理空格、标点等特殊字符时要提前清理干净。
- 对性能有极致要求的话,原生数组排序通常优于 Stream 方式。