2015-04-04 4 views
1

Я пишу программу, которая читает текстовый файл и добавляет уникальные слова и числа в ArrayList. Я использовал разделитель для этого, но при запуске программы я получаю исключение NoSuchElementException. Является ли мой разделитель неправильным или я совершил еще одну ошибку?Чтение слов и цифр из текстового файла

Вот моя программа:

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")).useDelimiter("[.,:;()?!\" \t]+~\\s"); 
     int totalWordCount = 0; 
     ArrayList<String> words = new ArrayList<String>(); 
     while ((fileScanner.hasNext()) && (!words.contains(fileScanner.next()))) 
     { 
     words.add(fileScanner.next()); 
     totalWordCount++; 
     } 
     System.out.println("There are " + totalWordCount + " unique word(s)"); 
     System.out.println("These words are:"); 
     System.out.println(words.toString()); 
     fileScanner.close(); 
    } 
}  

ответ

2

Это должно работать, вы можете использовать ToString или итератор, чтобы показать слова:

Set<String> words = new HashSet<String>(); 
     while ((fileScanner.hasNext())) { 
       words.add(fileScanner.next()); 
     } 
     System.out.println("There are " + words.size() + " unique word(s)"); 
     System.out.println("These words are:"); 
     //System.out.println(words.toString()); 
     for (Iterator<String> it = words.iterator(); it.hasNext();) { 
      String f = it.next(); 
      System.out.println(f); 
     } 
     fileScanner.close(); 
+0

Спасибо! Итератор помог. Я сделал несколько хитростей, и это сработало, как я этого хотел. Благодаря! – juliodesa

+0

Рад, что это помогло! – Pulse9

1

Я хотел бы использовать Set вместо List

Set<String> words = new HashSet<String>(); 
while (fileScanner.hasNext()) { 
     words.add(fileScanner.next()); 
+0

Это дает мне ошибку: Indexer.java:10: ошибка: несовместимые типы: ArrayList не могут быть преобразованы в Set слов = новый ArrayList (); – juliodesa

+0

моя ошибка, это должен быть новый HashSet –

+0

Я все еще получаю исключение NoSuchElementException, когда я это делаю. Был ли ваш ответ исправлять мою проблему или просто улучшить мой код? – juliodesa

1

Вероятно, исключение NoSuchElementException происходит из второго файла fileScanner.next() внутри цикла while.

Когда достигнут последний элемент из файла, он считывается из файлаScanner.next() в условии цикла while, в результате чего не осталось элементов, когда второй вызов файлового сценария выполняется внутри цикла.

Одним из решений может быть назвать fileScanner.next() один раз в итерации:

Scanner fileScanner = new Scanner(new File("File.txt")).useDelimiter("[.,:;()?!\" \t]+~\\s"); 
    int totalWordCount = 0; 
    Set<String> words = new HashSet<String>(); 
    String nextWord; 
    while ((fileScanner.hasNext()) && (!words.contains(nextWord = fileScanner.next()))) 
    { 
    words.add(nextWord); 
    totalWordCount++; 
    } 
    System.out.println("There are " + totalWordCount + " unique word(s)"); 
    System.out.println("These words are:"); 
    System.out.println(words.toString()); 
    fileScanner.close(); 
} 
+0

Я попробовал, и это не сработало. У меня был длинный код java в качестве моего ввода, и мой вывод был «Есть 1 уникальное слово (ы). Эти слова:« за которым следует весь ввод. – juliodesa

+0

О, я просто обратился к исключению NoSuchElementException. Использование Set вместо List определенно является ключевым как @ Pulse9 и упоминается. Список будет хранить каждый экземпляр слова; в то время как Set будет хранить только уникальные экземпляры. –

Смежные вопросы