java - 确定一个列表是否由 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 进行操作,那也会有所帮助。
解决方案
您可以在字符串中获取 a 并在将它们转换为数组之前对它们进行排序,而不是创建和排序 a char[]
or int[]
,这不能内联完成并因此“中断”流。但是请注意,这是一个,并且将包含数组的内存地址,这在这里不是很有用,因此在这种情况下更好地使用。Stream
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在评论中)快得多。
boolean anagrams = Stream.of(words)
.map(s -> IntBuffer.wrap(s.chars().sorted().toArray()))
.distinct().count() == 1;
推荐阅读
- c# - 为什么事件触发器在统一 2d 中不起作用?
- firemonkey - C++ Builder:转换和打印位图
- r - 如何使用 table() 的一维输出制作 data.frame?
- powershell - 如何从 Jenkins 构建中关注或选择安装向导屏幕
- html - 是否有替代品
Vuetify 的标签? - python - 如何检查标签是否包含在 CDATA 标签中?
- java - 调用抽象类的抽象方法
- r - 如何使用 modelssummary 函数在一个系数上方的回归表中添加文本行?
- python - 使用 readline() 轮询文件的更改适用于 macOS 但不适用于 Debian 9
- bash - 检查一个文件是否已更改,而另一个文件是否未使用 grep 进行 Git 预提交