2013-04-18 6 views
1

Так что это код, и он предназначен для случайного слова из списка, пользователь вводит значение, которое находится во внешнем текстовом файле, и если оно правильно, оно удаляет слово из в противном случае он сохранит это слово и добавит его в список пропущенных слов. Проблема в том, что слова не удаляются из списка, и я не могу напечатать ArrayList. Может ли кто-нибудь помочь мне с этой проблемой? Кроме того, есть ли какие-либо улучшения, которые я могу внести в код? Спасибо вам за вашу помощь.Программа обучения Vocab не работает должным образом

import java.io.*; 
import java.util.*; 

public class WordList1 { 
public static void main(String[] args) throws IOException{ 
    boolean fart = true; 

    FileReader fr = new FileReader("WL1.txt"); 
    BufferedReader br = new BufferedReader(fr); 

    Scanner console = new Scanner(System.in); 

    ArrayList wordArray = new ArrayList(); 
    ArrayList missedWords = new ArrayList(); 

    String input, stringArray[] = new String[2], answer; 

    while((input=br.readLine())!=null){ 
     stringArray = input.split(" "); 
     wordArray.add(stringArray); 
    } 

    while(fart){ 
     stringArray = (String[]) wordArray.get((int)(Math.random()*(wordArray.size()))); 
     System.out.println(stringArray[0]); 
     answer = console.nextLine(); 
     if(answer.equalsIgnoreCase(stringArray[1])){ 
      System.out.println("CORRECT"); 
      wordArray.remove(stringArray[1]); 
     } 
     if(!answer.equalsIgnoreCase(stringArray[1])){ 
      System.out.println("INCORRECT, " + stringArray[1]); 
      missedWords.add(stringArray[0]); 
     } 
     if(answer.equalsIgnoreCase("escape")){ 
      fart = false; 
      System.out.println(missedWords); 
     } 
     if(answer.equalsIgnoreCase("print")) 
      System.out.println(wordArray); 
    } 
} 

}

+7

программа, кажется, страдает от немного метеоризма .. – Oren

+0

Я думаю, что 'crapOut' это лучше, чем имя переменной' fart'. :) – RustyTheBoyRobot

ответ

3

System.out.println(wordArray) собирается позвонить .toString() на вашем ArrayList, который дает информацию о ссылке, но не данные в списке. Вы должны выписать каждый элемент в списке, а не сам объект списка:

System.out.println("Words in the array:"); 
for (String eachWord : wordArray) { 
    System.out.println(eachWord); 
} 

Теперь, это работает только, если вы правильно определили свой список, чтобы быть список строк. Это определение создает список любого объекта Java:

ArrayList wordArray = new ArrayList(); 

Лучше всего указать, какие элементы будут отображаться в вашем списке. Это делается с помощью дженериков:

ArrayList<String> wordArray = new ArrayList<>(); 

Это предполагает, что ваш wordArray на самом деле список слов, но ваш код добавляет весь массив в wordArray списке. Что это дает вам? Я думаю, что вы хотите:

while((input=br.readLine())!=null){ 
    stringArray = input.split(" "); 
    // Add each word, not the array 
    wordArray.addAll(Arrays.asList(stringArray)); 
} 

Ваша проблема со словами не получаю удален аналогичная проблема. В ArrayList содержится массив строк, но вы пытаетесь удалить одну строку. Вызов .remove() не найдет строку в вашем ArrayList.

2

нет необходимости оценивать состояние в два раза.

Заменить

if(answer.equalsIgnoreCase(stringArray[1])){ 
     [...] 
    } 
    if(!answer.equalsIgnoreCase(stringArray[1])){ 
     [...] 
    } 

с

if(answer.equalsIgnoreCase(stringArray[1])) { 
     [...] 
    } else { 
     [...] 
    } 

Если сравнить переменную с несколькими различными константами использовать «еще, если» (ответ не может быть «бежать» и «печать» в то же время). И изменить порядок, чтобы избежать исключения NullPointer:

if("escape".equalsIgnoreCase(answer)) { 
    [...] 
} else if("print".equalsIgnoreCase(answer)) { 
    [...] 
} 
1

Проблема заключается в wordArray.remove(stringArray[1]);

wordarray представляет собой массив строковых массивов.

Так изменить эту строку wordArray.remove(stringArray)

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