2015-02-18 3 views
0

В настоящее время я делаю программу, которая требует от меня проверять мои слова в массиве на все слова в текстовом файле (словарь) и возвращать значение 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; 
    } 

Я знаю, что это только проверяет первое слово в «линии», я задаюсь вопросом, как перейти к следующему слову, чтобы сравнить его против моего слова в массиве

+2

1. Не используйте '==' для строк. 2. 'if (x) возвращает true; else return false; 'является очень многословным синонимом для' return x'. 3. Верните «true» только в том случае, если вы что-то найдете, поэтому удалите предложение 'else'. –

+1

Удалить условие if и else и просто вернуть -> return (arrayOfWords [0] .equalsIgnoreCase (строка)) – exoddus

+0

Ваш метод не имеет смысла. isEnglishWord звучит как функция, которая проверяет, является ли одно слово английским словом, а не полный список строк содержит английское слово. Либо измените имя метода, либо принимайте только одну строку в качестве параметра. – barq

ответ

4

Удалить эту часть:

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

Лучше сравните строки с arrayOfWords [0] .equalsIgnoreCase (строка) – exoddus

+0

@exoddus - OP не указал *, что *. :) – TheLostMind

0

Прежде всего использовать 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; 
} 

Это при условии, что ваш метод только должен соответствовать ни одного слова из всего файла с одним словом из массива, чтобы вернуть истинный. Я не уверен, насколько полезен этот метод.

0

Вы проверяете только первое слово в 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; 
} 
2

Помимо фиксации кода очевидным образом, вы можете также рассмотреть вопрос активизации на Java 8 идиомы:

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

И далее, типичный оптимизации, которая превратит ваш O (п) алгоритм в 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); 

В качестве альтернативы, если пространство является проблемой, можно просто отсортировать массив и использовать JDK предоставленный бинарный поиск по нему, в результате чего в O (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 делает ваш код более очевидным и легче отлаживать.