我正在编写一个程序,该程序读取包含多行文本的文本文件,并向ArrayList添加唯一的单词。然后,我需要对此ArrayList进行排序并打印它。 我的意见是:
你好我的 我的名字是 Java的。
我原本以为我的问题是,一旦扫描仪击中了已存在于ArrayList中的单词,它就会停止。但是,在改变我的输入后,我不知道我的问题是什么了。 我的输出现在是:
有两个独特的单词
这些话是:
是
我
我需要输出:
有5个独特的单词
这些话是:
你好
Java的
是
我
命名
这是我的代码:
import java.util.*;
import java.io.*;
public class Indexer
{
public static void main(String[] args) throws FileNotFoundException
{
Scanner fileScanner = new Scanner(new File("File.txt"));
fileScanner.useDelimiter("[^A-Za-z0-9]");
ArrayList<String> words = new ArrayList<String>();
while (fileScanner.hasNext())
{
if (!words.contains(fileScanner.next()) && (fileScanner.hasNext()))
{
words.add(fileScanner.next());
}
}
Collections.sort(words);
System.out.println("There are " + words.size() + " unique word(s)");
System.out.println("These words are:");
for (Iterator<String> it = words.iterator(); it.hasNext();)
{
String f = it.next();
System.out.println(f);
}
fileScanner.close();
}
}
我做错了什么?
答案 0 :(得分:1)
首先,不要在循环内调用scanner.next()两次
ArrayList<String> words = new ArrayList<String>();
while (fileScanner.hasNext())
{
String word = fileScanner.next();
if (!words.contains(word))
{
words.add(word);
}
}
答案 1 :(得分:1)
你反复使用next()
,比应该使用的更多。在变量中收集next()
调用的值,然后使用它。 E.g。
while (fileScanner.hasNext())
{
String nextWord = fileScanner.next();
if (!words.contains(nextWord))
{
words.add(nextWord);
}
}
答案 2 :(得分:1)
问题在于:
if (!words.contains(fileScanner.next()) && (fileScanner.hasNext()))
{
words.add(fileScanner.next());
}
每次拨打next()
都会读到另一个字。因此,在上面的代码中,您正在阅读和测试一个单词,然后阅读并添加下一个单词。这是不正确的。你不想丢掉话语......
提示:使用局部变量来保存刚刚读过的单词......