我正在扫描文件并尝试跟踪角色出现的次数。
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.");
}
}
}
答案 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();
// ...