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 方式。

原始标题:Sorting a String Alphabetically in Java