首页 > 解决方案 > 确定一个列表是否由 Java 8 中的字谜元素组成

问题描述

我想确定一个列表是否是字谜或不使用 Java 8。

示例输入:

"cat", "cta", "act", "atc", "tac", "tca"

我已经编写了以下函数来完成这项工作,但我想知道是否有更好、更优雅的方法来做到这一点。

boolean isAnagram(String[] list) {
    long count = Stream.of(list)
            .map(String::toCharArray)
            .map(arr -> {
                Arrays.sort(arr);
                return arr;
            })
            .map(String::valueOf)
            .distinct()
            .count();
    return count == 1;

}

看来我无法使用Stream.sorted()方法对 char 数组进行排序,所以这就是我使用第二个 map 运算符的原因。如果有某种方法可以直接对 char 流而不是 char 数组的 Stream 进行操作,那也会有所帮助。

标签: javajava-8java-stream

解决方案


您可以在字符串中获取 a 并在将它们转换为数组之前对它们进行排序,而不是创建和排序 a char[]or int[],这不能内联完成并因此“中断”流。但是请注意,这是一个,并且将包含数组的内存地址,这在这里不是很有用,因此在这种情况下更好地使用。StreamcharsIntSteamString.valueOf(int[])Arrays.toString

boolean anagrams = Stream.of(words)
        .map(String::chars).map(IntStream::sorted)
        .map(IntStream::toArray).map(Arrays::toString)
        .distinct().count() == 1;

当然,你也可以用map(s -> Arrays.toString(s.chars().sorted().toArray()))四个来代替系列maps。不确定速度是否存在(显着)差异,这可能主要是口味问题。

此外,您可以使用IntBuffer.wrap使数组具有可比性,这应该比Arrays.toString(感谢Holger在评论中)快得多。

boolean anagrams = Stream.of(words)
        .map(s -> IntBuffer.wrap(s.chars().sorted().toArray()))
        .distinct().count() == 1;

推荐阅读