Java 8 Steams-如何比较元素?

问题描述 投票:1回答:2

我想使用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中的单词是否为字谜?有什么方法可以将一个单词与流中的所有单词进行比较?

java java-stream inputstream fileinputstream anagram
2个回答
0
投票

[我认为您最好的选择可能是使用多图收集器,以字符串的排序版本作为图的键,将流转换为Guava multimap。有关如何执行此操作的示例,请参见Cleanest way to create a guava MultiMap from a java8 stream。如果您只想要结果的字谜集,则可以使用multimap.asMap().entrySet().stream()...根据您的需要过滤和收集结果。


0
投票

杂乱的排序,但是可以。我可能会单独拉出排序方法,而不是使用流来做到这一点。

      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);
      }

可能的改进是首先过滤单词的长度。

© www.soinside.com 2019 - 2024. All rights reserved.