正在扫描字符错误?

时间:2016-10-07 00:51:39

标签: java dictionary methods java.util.scanner

我正在扫描文件并尝试跟踪角色出现的次数。

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()。然而,扫描仪的api说

  

hasNext()   如果此扫描器的输入中有另一个标记,则返回true。

这是否意味着扫描仪无法扫描每个字符? 难道这不只是扫描字符,将它们添加到地图中并在每次看到某些内容时增加计数吗?

最后注意事项:如果每个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.");
        }
    }

}

1 个答案:

答案 0 :(得分:0)

根据Javadocs for the next() method of java.util.Scanner

public String next()
     

查找并返回此扫描仪的下一个完整令牌。完整的标记之前和之后是与分隔符模式匹配的输入。

可以看出,此方法不返回Character;它会返回String,这就是您收到错误的原因。

标记基本上是一个位于分隔符的两个实例之间的子字符串。 Scanner的默认分隔符是空格对象(\s\t\n等)。因此,扫描程序会遍历该文件,每次next()的调用都将返回下一个字符序列,这些字符位于被视为分隔符之间。

所以你可以做的是更改分隔符,以便扫描程序将文件中的每个字符作为一个标记进行计数,尽管这有点复杂。你可以做的是利用String类有一个方法toCharArray()的事实,它将字符串中的字符序列作为数组返回。您可以通过这种方式更轻松地计算单个角色:

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