2016-10-07 3 views
0

Я сканирую файл и пытаюсь отследить количество раз, когда появляется персонаж.Сканирование на ошибку символов?

public static Map<Character, Integer> getCountMap(Scanner in){ 
    Map<Character, Integer> wordCountMap = new TreeMap<Character, Integer>(); 

    while (in.hasNext()){ 
     Character word = in.next().toLowerCase(); 
     //CHAR HAS BEEN SEEN, ADD 
     if(wordCountMap.containsKey(word)){ 
      int count = wordCountMap.get(word); 
      wordCountMap.put(word, count + 1); 
     } 
     //NEW CHAR, CREATE 
     else { 
      wordCountMap.put(word, 1); 
     } 
    } 
return wordCountMap; 
} 

Я получаю сообщение об ошибке для Character word = in.next().toLowerCase();

Я проверил Java API, и символы, безусловно, имеют доступ к toLowerCase(). Однако апи для сканеров говорит

hasNext() Возвращает истину, если этот сканер имеет еще один маркер в его входе.

Означает ли это, что сканер не может сканировать через символ? Не следует ли это просто проверять символы, добавляя их на карту и увеличивая счет каждый раз, когда он что-то видит?

Заключительное примечание: этот код работает нормально, если каждый Character заменен на String. Я могу получить количество слов без проблем. Кол-во, не так много.

Основной метод (В случае, если это требуется)

public static void main(Character[] args) throws FileNotFoundException{ 

    //read the book into the map 
    Scanner in = new Scanner(new File("moby.txt")); 
    Map<Character, Integer> wordCountMap = getCountMap(in); 


    for (Character word: wordCountMap.keySet()){ 
     int count = wordCountMap.get(word); 
     if (count > OCCURRENCES){ 
      System.out.println(word + " occurs " + count + " times."); 
     } 
    } 

} 
+0

Вы уверены, что 'in.next()' возвращает объект 'Character'? – TNT

+0

@TNT Я не совсем уверен. Я просто проверял API, и я даже не могу найти его в .next. Я знаю, что это работает для струн ... где бы я хотел понять это? Когда я имею дело со строками, мой сканер (в) заполняет строку следующим значением. Так что, возможно, это не принимает символ ... – Podo

+0

@TNT, «Метод java.util.Scanner.next() находит и возвращает следующий полный токен из этого сканера». – Podo

ответ

0

Согласно Javadocs for the next() method of java.util.Scanner:

public String next() 

Находит и возвращает следующий полный маркер из этого сканера. Перед первым токеном предшествует ввод, соответствующий шаблону разделителя.

Как видно, этот метод не возвращается Character; он возвращает String, поэтому вы получаете эту ошибку.

A токен - это в основном подстрока, которая находится между двумя экземплярами разделителя. Разделитель по умолчанию для Scanner представляет собой пробельный объект (\s, \t, \n и т. Д.). Таким образом, сканер проходит через файл, и каждый вызов next() возвращает следующую последовательность символов, которая находится между тем, что рассматривается как разделитель.

Итак, что вы можете сделать, это изменить разделитель так, чтобы сканер учитывал каждый символ в файле как токен, хотя это немного сложнее. Вместо этого вы можете использовать тот факт, что класс String имеет метод toCharArray(), который возвращает последовательность символов в строке в виде массива. Вы можете считать отдельные символы намного проще:

String word = in.next().toLowerCase(); 
char[] charsInWord = word.toCharArray(); 
// ... 
+0

Я действительно собирался сделать цикл charAt, однако toCharArray гораздо более плавный. – Podo

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