确定 Java 8 中的列表是否由字谜元素组成

2024-03-25

我想确定列表是否是字谜或不使用 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;

}

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


而不是创建和排序char[] or int[],这不能内联完成,从而“破坏”流,你可以获得Stream of the chars在字符串中并在将它们转换为数组之前对它们进行排序。请注意,这是一个IntSteam,不过,并且String.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 https://stackoverflow.com/users/2711488/holger在评论中)。

boolean anagrams = Stream.of(words)
        .map(s -> IntBuffer.wrap(s.chars().sorted().toArray()))
        .distinct().count() == 1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 Java 8 中的列表是否由字谜元素组成 的相关文章

随机推荐