我想使用Java Stream在.txt文件中找到字谜。这是我所拥有的:
InputStream is = new URL("http://wiki.puzzlers.org/pub/wordlists/unixdict.txt").openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
Stream<String> stream = reader.lines()) {
和字谜的方法:
public boolean isAnagram(String firstWord, String secondWord) {
char[] word1 = firstWord.replaceAll("[\\s]", "").toCharArray();
char[] word2 = secondWord.replaceAll("[\\s]", "").toCharArray();
Arrays.sort(word1);
Arrays.sort(word2);
return Arrays.equals(word1, word2);
}
如何使用Java 8 Stream检查unixdict.txt中的单词是否为字谜?有什么方法可以将一个单词与流中的所有单词进行比较?
[我认为您最好的选择可能是使用多图收集器,以字符串的排序版本作为图的键,将流转换为Guava multimap
。有关如何执行此操作的示例,请参见Cleanest way to create a guava MultiMap from a java8 stream。如果您只想要结果的字谜集,则可以使用multimap.asMap().entrySet().stream()...
根据您的需要过滤和收集结果。
杂乱的排序,但是可以。我可能会单独拉出排序方法,而不是使用流来做到这一点。
InputStream is = new URL("http://wiki.puzzlers.org/pub/wordlists/unixdict.txt")
.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String word = "dear";
reader.lines().filter(w -> Arrays.stream(w.split("")).sorted().collect(
Collectors.joining()).compareTo(
Arrays.stream(word.split("")).sorted().collect(
Collectors.joining())) == 0).forEach(
System.out::println);
以下更好。
String word = "dear";
reader.lines().filter(
w -> sortedWord(w).compareTo(sortedWord(word)) == 0).forEach(
System.out::println);
static String sortedWord(String w) {
char[] chs = w.toCharArray();
Arrays.sort(chs);
return String.valueOf(chs);
}
可能的改进是首先过滤单词的长度。