2013-04-18 20 views
1

所以这是代码,它是为了从列表中给出一个随机单词,让用户输入在外部文本文件中的含义,如果它是正确的,它将从单词中删除该列表否则它保留单词并将其添加到错误词表中。问题是这些单词没有从列表中删除,我似乎无法打印ArrayList。任何人都可以帮我解决这个问题吗?另外,我可以对代码做出什么改进?感谢您的帮助。单词学习程序无法正常工作

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 { 
     [...] 
    } 

如果你比较有多个不同的常数变量使用“否则,如果”(答案永远是“逃离”和“打印”在同一时间)。并更改为了避免空指针异常:

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

的问题是在wordArray.remove(stringArray[1]);

wordarray是串数组的数组。

因此改变该行wordArray.remove(stringArray)