1

所以这就是代码,它的目的是从列表中给出一个随机单词,让用户输入外部文本文件中的含义,如果正确,它会从列表中删除该单词,否则它会保留该单词并添加将其添加到missedWord 列表中。问题是单词没有从列表中删除,而且我似乎无法打印 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);
    }
}

}

4

3 回答 3

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 中找到字符串。

于 2013-04-18T13:38:29.777 回答
2

无需对条件进行两次评估。

代替

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

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

如果您将一个变量与多个不同的常量进行比较,请使用“else if”(答案永远不能同时是“escape”和“print”)。并更改顺序以避免 Nullpointer 异常:

if("escape".equalsIgnoreCase(answer)) {
    [...]
} else if("print".equalsIgnoreCase(answer)) {
    [...]
}
于 2013-04-18T13:25:54.283 回答
1

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

wordarray是一个字符串数组的数组。

所以将该行更改为wordArray.remove(stringArray)

于 2013-04-18T13:40:36.427 回答