2013-10-24 2 views
2

Это метод проверки орфографии. Как поясняет заголовок, он должен возвращать true тогда и только тогда, когда все слова, добавленные в arraylist, находятся в родительском массиве, слова. В противном случае он должен вернуть ложное значение. Я боролся с этим в течение нескольких часов, и это моя текущая ситуация ...Проверка списка массивов на другой список массивов

/** 
    * This method returns true if (and only if) all words in the 
    * given wordList are found in the dictionary. 
    */ 
    public boolean allKnown(ArrayList<String> wordList) 
    { 
     boolean result = true; 
     for(int index = 0; index < wordList.size(); index++) 
     { 
      if(words.contains(!wordList.contains(index))) 
      { 
       result = false; 
      } 
     result = true; 
     } 
    return result; 
    } 

Все, что мне действительно нужно, это способ наработать да или нет, но я потерял. Пожалуйста, попробуйте работать с указанным кодом, так как это упражнение для обучения этому коду. Спасибо!

+0

Сделайте копию массива ArrayList, который вы тестируете, затем copy.removeAll (известный) и проверьте размер копии, если 0 все в копии было известно. –

ответ

1

Выньте result = true; - вы не хотите, чтобы сбросить значение до true на каждом шагу цикла.

изменить Также wordList.contains к wordList.get (потому что вы хотите, чтобы получить слово в определенный индекс, не проверить, если он содержится в wordList) и переместить ! из (потому что вы не можете «не» строка).

И вы также можете оптимизировать, проверив значение result в условии for-loop (или просто возвращаясь непосредственно в if-statement).

public boolean allKnown(ArrayList<String> wordList) 
{ 
    boolean result = true; 
    for(int index = 0; index < wordList.size() && result; index++) 
    { 
     if(!words.contains(wordList.get(index))) 
     { 
      result = false; 
     } 
    } 
    return result; 
} 

Если words действительно является массивом, а не ArrayList, он не имеет метод contains, вы должны либо иметь двойной для цикла, или преобразовать его в список:

List<String> parentWords = Arrays.asList(words); 
    ... 
    if (parentWords.contains(...)) 
0

Не возвращайте результат в true после вашего if. Так как вся эта функция всегда будет возвращать true.

2

Ваша проблема здесь:

if(words.contains(!wordList.contains(index))) 

!wordList.contains(index) это логическое выражение, поэтому оно всегда имеет значение либо true или false. Таким образом, вы фактически проверяете, содержит ли список words true или false, а не то, что вы хотите. Замените его if(!words.contains(wordList.get(index)), чтобы проверить, найдено ли текущее слово в словаре.

Я предлагаю следующее решение: iterate wordList слово за словом, и для каждого слова проверьте, найден ли он в словаре. Если это не так, немедленно верните false. Если вы достигнете конца цикла, верните true.

0

Несколько советов:

  1. Не используйте ArrayList в качестве параметра метода, всегда используйте более абстрактный List (ни один из вашего кода не зависит от ArrayList, так что вы можете изменить реализацию позже, если вам нравится).
  2. Итерации над объектами List с использованием упрощенного синтаксиса, показанного ниже.
  3. Вам нужно только одно слово, которое не должно быть в списке words, чтобы вернуть false, так что сделайте именно это (как показано ниже).

public boolean allKnown(List<String> wordList) { 
    for (String word : wordList) { 
     if (!words.contains(word)) { 
      return false; 
     } 
    } 
    return true; 
} 
0
public boolean allKnown(ArrayList<String> wordList) 
{ 
    boolean result = true; 
    for(String word : wordList) 
    { 
     if(!words.contains(word)) 
     { 
      result = false; 
     } 
    } 
    return result; 
} 
2

Здесь может быть другое решение:

public static boolean allKnown(List<String> parent, List<String> child) { 
    List<String> temp = new ArrayList<String>(child); 
    temp.removeAll(parent); 
    return temp.isEmpty(); 
} 

Например:

List<String> parent = Arrays.asList("w1", "w2", "w3", "w4"); 
List<String> childOk = Arrays.asList("w1", "w4"); 
List<String> childKo = Arrays.asList("w1", "xx"); 
System.out.println(allKnown(parent, childOk)); 
System.out.println(allKnown(parent, childKo)); 

Печать:

true 
false 
0

Вот упрощенная версия:

public boolean allKnown(List<String> wordList) { 
    List<String> wordListCopy = new ArrayList<String>(wordList); 
    return !wordListCopy.retainAll(words); 
} 

PS:retainAll() удаляет от вас wordList всех его элементов, которые не содержатся в вас dictionnary. Этот метод возвращает true, если ваш wordList был изменен в результате вызова (после удаления несуществующего элемента), другими словами, этот метод возвращает false, когда все ваши wordList элементы существуют у вас dictionnary.

Смежные вопросы