对于每个循环不返回值?

For each loop not returning values?

我目前正在制作一个程序,要求我根据文本文件(字典)中的所有单词检查数组中的单词,并且 return 如果是,则值为 true,否则为 false 't。 到目前为止,这是我的代码

 public static boolean isEnglishWord(String[] arrayOfWords) throws IOException {
     for (String line : Files.readAllLines(Paths.get("words.txt"), StandardCharsets.UTF_8)) {
         if(arrayOfWords[0] == line)
         {
             return true;
         }
         else
         {
             return false;
         }
     }
     return false;
    }

我知道这只检查 'line' 中的第一个词,我想知道如何移动到下一个词以将它与我在数组中的词进行比较

删除这部分:

public static boolean isEnglishWord(String[] arrayOfWords) throws IOException {
     for (String line : Files.readAllLines(Paths.get("words.txt"), StandardCharsets.UTF_8)) {
         if(arrayOfWords[0].equals(line)) // use `equals()` instead of `==`
         {
             return true;
         }
      //   else    --> If word is not found, you will eventually return false
       //  {
       //      return false;
       //  }
     }
     return false;
    }

首先在比较字符串时使用equals。其次,使用嵌套循环:

public static boolean isEnglishWord(String[] arrayOfWords) throws IOException {
    for (String line : Files.readAllLines(Paths.get("words.txt"), StandardCharsets.UTF_8)) {
        for (String word : arrayOfWords) {
            if(word.equals(line))
            {
                return true;
            }
        }
    }
    return false;
}

这是假设您的方法只需将整个文件中的单个单词与数组中的单个单词进行匹配即可 return 为真。我不确定该方法有多大用处。

您只检查 arrayOfWords 中的第一个单词。您需要两个循环,以便根据 arrayOfWords 中的所有单词检查文件中的所有单词。

public static boolean isEnglishWord(String[] arrayOfWords) throws IOException {
     for (String line : Files.readAllLines(Paths.get("words.txt"), StandardCharsets.UTF_8)) {
         for (String word: arrayOfWords)
            return word.equalsIgnoreCase(line);    
     }
     return false;
}

除了以明显的方式修复代码外,您还可以考虑升级到 Java 8 习语:

return Files.lines(Paths.get("words.txt"), UTF_8)
            .anyMatch(w1 -> Stream.of(arrayOfWords)
                                  .anyMatch(w2 -> w2.equals(w1)));

此外,将 O(n2) 算法转换为 O(n) 的典型优化是使用 Set<String> 而不是字符串数组:

final Set<String> setOfWords = new HashSet<>(Arrays.asList(arrayOfWords));

然后你会写

return Files.lines(Paths.get("words.txt"), UTF_8)
            .anyMatch(setOfWords::contains);

或者,如果 space 是一个问题,您可以只对数组进行排序并使用 JDK 提供的二进制搜索对其进行搜索,从而导致 O(n log n) 复杂度:

Arrays.sort(arrayOfWords);

return Files.lines(Paths.get("words.txt"), UTF_8)
            .anyMatch(w -> Arrays.binarySearch(arrayOfWords, w) >= 0);

最后,看来你真正要检查的是所有文件中的单词都是英文单词,而不是文件中至少包含一个这样的单词。经过上述重构后,逻辑非常清晰,现在只需替换​​两个字符即可轻松更改:

return Files.lines(Paths.get("words.txt"), UTF_8)
            .allMatch(setOfWords::contains);

...这很好地展示了 FP 习惯用法的简洁性如何使您的代码更加明显和易于调试。