Java 对于每个循环,是否不返回值?

Java 对于每个循环,是否不返回值?,java,loops,for-loop,each,Java,Loops,For Loop,Each,我目前正在制作一个程序,要求我对照文本文件(字典)中的所有单词检查数组中的单词,如果是,则返回true值,如果不是,则返回false值。 这是到目前为止我的代码 public static boolean isEnglishWord(String[] arrayOfWords) throws IOException { for (String line : Files.readAllLines(Paths.get("words.txt"), StandardCharsets.UTF_

我目前正在制作一个程序,要求我对照文本文件(字典)中的所有单词检查数组中的单词,如果是,则返回true值,如果不是,则返回false值。 这是到目前为止我的代码

 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;
    }
我知道这只检查“行”中的第一个单词,我想知道如何移动到下一个单词,将其与数组中的我的单词进行比较

删除此部分:

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;
    }
删除此部分:

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

这是假设您的方法只需将整个文件中的一个单词与数组中的一个单词进行匹配,即可返回true。我不确定这个方法有多有用。

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

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

这是假设您的方法只需将整个文件中的一个单词与数组中的一个单词进行匹配,即可返回true。我不确定这个方法有多有用。

您只检查数组中的第一个单词。您需要两个循环,以便对照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;
}

您只检查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)的典型优化是使用
集合
而不是字符串数组:

final Set<String> setOfWords = new HashSet<>(Arrays.asList(arrayOfWords));
或者,如果空间是一个问题,您可以对数组进行排序,并在其上使用JDK提供的二进制搜索,从而导致O(n log n)复杂性:

Arrays.sort(arrayOfWords);

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

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

。。。很好地演示了FP成语的简洁性使代码更明显和更容易调试。

< P>除了以明显的方式来修复代码之外,还可以考虑逐步升级到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)的典型优化是使用
集合
而不是字符串数组:

final Set<String> setOfWords = new HashSet<>(Arrays.asList(arrayOfWords));
或者,如果空间是一个问题,您可以对数组进行排序,并在其上使用JDK提供的二进制搜索,从而导致O(n log n)复杂性:

Arrays.sort(arrayOfWords);

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

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

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

1。不要在字符串上使用
==
。2. <代码>如果(x)返回true;否则返回false
return x
的一个非常冗长的同义词。3.如果找到某个内容,则只返回
true
,因此删除
else
子句。删除if和else条件,只需返回->返回(arrayOfWords[0]。equalsIgnoreCase(line))您的方法没有意义。isEnglishWord听起来像是一个检查一个单词是否为英语单词的函数,而不是检查整个字符串列表是否包含英语单词。要么更改方法名称,要么只接受单个字符串作为参数。@barq我刚才只是测试数组中的第一个单词,现在我正在检查整个单词数组,看看它们是否都是英文单词。然后你应该只将该单词传递给你的函数,而不是整个数组。1。不要在字符串上使用
==
。2. <代码>如果(x)返回true;否则返回false是
return x
的一个非常冗长的同义词。3.如果找到某个内容,则只返回
true
,因此删除
else
子句。删除if和else条件,只需返回->返回(arrayOfWords[0]。equalsIgnoreCase(line))您的方法没有意义。isEnglishWord听起来像是一个检查一个单词是否为英语单词的函数,而不是检查整个字符串列表是否包含英语单词。要么更改方法名称,要么只接受单个字符串作为参数。@barq我只是在测试数组中的第一个单词,现在我正在检查整个单词数组,看看它们是否都是英文单词。然后你应该只将该单词传递给函数,而不是整个数组。最好将字符串与arrayOfWords[0]进行比较.equalsIgnoreCase(line)@exodus-OP未指定:最好将字符串与arrayOfWords[0]进行比较。equalsIgnoreCase(line)@exodus-OP没有指定: