我想确定列表是否是字谜或不使用 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(使用前将#替换为@)