Java分隔符跳过一个单词

Tri*_*7er 2 java unique java.util.scanner

我正在读取一个文本文件并将该文本文件中的一组唯一单词存储到一个ArrayList中(如果有更好的结构,请建议这样做).我正在使用扫描仪扫描文本文件并将分隔符指定为""(空格),如下所示;

    ArrayList <String> allWords = new ArrayList <String> ();
    ArrayList <String> Vocabulary = new ArrayList <String> ();
    int count = 0;

    Scanner fileScanner = null;
    try {
        fileScanner = new Scanner (new File (textFile));

    } catch (FileNotFoundException e) {
        System.out.println (e.getMessage());
        System.exit(1);
    }

    fileScanner.useDelimiter(" ");

    while (fileScanner.hasNext()) {

        allWords.add(fileScanner.next().toLowerCase());

        count++;

        String distinctWord = (fileScanner.next().toLowerCase());
        System.out.println (distinctWord.toString());

        if (!allWords.contains(distinctWord)) {

            Vocabulary.add(distinctWord);

        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,在打印词汇表的内容之后,在每个单词之后都会跳过一个单词.因此,例如,如果我有以下文本文件;

"敏捷的棕色狐狸跳过了懒狗"

印刷的内容是"快速狐狸懒",然后它给我一个错误;

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at *java filename*.getWords(NaiveBayesTxtClass.java:82)
    at *java filename*.main(NaiveBayesTxtClass.java:22)
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些关于如何解决这个问题的建议吗?我感觉它与fileScanner.useDelimiter和fileScanner.hasNext()语句有关.

Hov*_*els 5

在检查hasNext()一次后,你正在调用Scanner#next()两次,而你忽略了next()的一个返回.

你在(1)调用它并将其添加到allWords
并在(2)再次调用它并打印它.

while (fileScanner.hasNext()) {

    allWords.add(fileScanner.next().toLowerCase()); // **** (1)

    count++;

    String distinctWord = (fileScanner.next().toLowerCase());  // **** (2)
    System.out.println (distinctWord.toString());

    if (!allWords.contains(distinctWord)) {

        Vocabulary.add(distinctWord);

    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案:调用Scanner#next()一次,保存返回给变量的String,然后将变量添加到HashSet,并打印变量.例如,

while (fileScanner.hasNext()) {
    String word = fileScanner.next().toLowerCase();
    allWords.add(word); // **** (1)
    count++;
    // String distinctWord = (fileScanner.next().toLowerCase());  // **** (2)
    System.out.println (word);
    vocabularySet.add(word); // a HashSet
}
Run Code Online (Sandbox Code Playgroud)

安全的一般规则是,你应该有每个呼叫到一比一的关系Scanner#hasNextXXX()Scanner#nextXXX()