Java分隔符跳过一个单词

Java分隔符跳过一个单词,java,unique,java.util.scanner,Java,Unique,Java.util.scanner,我正在读取一个文本文件,并将该文本文件中的一组唯一单词存储到ArrayList中(请建议是否有更好的结构)。我正在使用scanner扫描文本文件,并将分隔符指定为“”(空格),如下所示 ArrayList <String> allWords = new ArrayList <String> (); ArrayList <String> Vocabulary = new ArrayList <String> (); int c

我正在读取一个文本文件,并将该文本文件中的一组唯一单词存储到ArrayList中(请建议是否有更好的结构)。我正在使用scanner扫描文本文件,并将分隔符指定为“”(空格),如下所示

    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);

        }
    }
有谁能给我一些关于如何解决这个问题的建议吗?我感觉这与fileScanner.usedimiter和fileScanner.hasNext()语句有关。

在检查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);

    }
}
解决方案:调用Scanner#next()一次,保存返回到变量的字符串,然后将变量添加到哈希集,并打印变量。e、 g

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
}

一般安全规则是,每次调用
Scanner\hasNextXXX()
Scanner\nextXXX()

时,您都应该有一对一的关系,因为您还需要数据结构,您可以执行以下操作:

    List<String> allWords = new ArrayList<String>();
    SortedSet<String> Vocabulary = new TreeSet<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()) {
        String word = fileScanner.next().toLowerCase();
        allWords.add(word);
        if (Vocabulary.add(word)) {
            System.out.print("+ ");
        }
        System.out.println(word);
    }
List allWords=new ArrayList();
SortedSet词汇表=新树集();
整数计数=0;
Scanner fileScanner=null;
试一试{
fileScanner=新扫描仪(新文件(textFile));
}catch(filenotfounde异常){
System.out.println(e.getMessage());
系统出口(1);
}
fileScanner.useDelimiter(“”);
while(fileScanner.hasNext()){
String word=fileScanner.next().toLowerCase();
添加(word);
if(词汇表.添加(单词)){
系统输出打印(“+”);
}
System.out.println(word);
}

如您所见,变量由接口(List、SortedSet)声明,并用一个具体的类实现。这不仅允许重新实现,而且对函数参数特别有用。

使用而不是
ArrayList
-它会自动忽略重复项。谢谢你,Greg,使用HashSet简单得多,工作量也少得多。非常感谢。
    List<String> allWords = new ArrayList<String>();
    SortedSet<String> Vocabulary = new TreeSet<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()) {
        String word = fileScanner.next().toLowerCase();
        allWords.add(word);
        if (Vocabulary.add(word)) {
            System.out.print("+ ");
        }
        System.out.println(word);
    }