在Java中按字母顺序对字符串进行排序

2025/04/10

1. 概述

在本教程中,我们将展示如何按字母顺序对字符串进行排序。

我们这样做可能有很多原因-其中之一可能是验证两个单词是否由相同的字符集组成,这样,我们就可以验证它们是否是字谜。

2. 对字符串进行排序

在内部,String使用字符数组进行操作。因此,我们可以使用toCharArray() : char[]方法,对数组进行排序并根据结果创建一个新的String

@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");
}

这里,我们使用与第一个例子相同的算法,但使用Stream sorted()方法对char数组进行排序。

注意,字符是按照其ASCII码排序的,因此大写字母总是出现在开头。因此,如果我们想对“abC”进行排序,排序结果将是“Cab”。

为了解决这个问题,我们需要使用toLowerCase()方法转换字符串,我们将在Anagram验证器示例中执行此操作。

3. 测试

为了测试排序,我们将构建一个字谜验证器。如前所述,当两个不同的单词或句子由同一组字符组成时,就会发生字谜。

让我们看一下AnagramValidator类:

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. 总结

在这篇简短的文章中,我们展示了如何以两种方式按字母顺序对字符串进行排序。此外,我们还实现了使用字符串排序方法的字谜验证器。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章