基本上我正在尝试使用String作为键(单个字符)和整数变量(字符频率)来实现映射。
程序运行时,我的频率不准确。 有谁看到我哪里出错?
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class WordCount {
public static void main(String[] args) throws FileNotFoundException{
File f1 = new File("article.txt");
Scanner scan = new Scanner(f1).useDelimiter("|");
Map<String, Integer> wordMap = new HashMap<String, Integer>();
String letter;
Integer value = 0;
while(scan.hasNext()){
letter = scan.next();
if(wordMap.containsKey(letter)) wordMap.put(letter, value++);
else wordMap.put(letter, new Integer(value++));
}
System.out.println(wordMap);
}
}
答案 0 :(得分:3)
看起来问题就在这里:
while(scan.hasNext()){
letter = scan.next();
if(wordMap.containsKey(letter)) wordMap.put(letter, value++); // problem
else wordMap.put(letter, new Integer(value++));
}
if语句应如下所示:
if (wordMap.containsKey(letter)) {
Integer prev = wordMap.get(letter);
wordMap.put(letter, prev++);
} else {
wordMap.put(letter, 1);
}
虽然要好一点,但你只想在地图上进行一次查找,如下所示:
Integer prev = wordMap.get(letter);
if (prev == null) {
wordMap.put(letter, 1);
} else {
wordMap.put(letter, prev++);
}
答案 1 :(得分:1)
这个位错了
Integer value = 0;
while(scan.hasNext()){
letter = scan.next();
if(wordMap.containsKey(letter)) wordMap.put(letter, value++);
else wordMap.put(letter, new Integer(value++));
}
应该是
while(scan.hasNext()){
letter = scan.next();
//get current count
int value;
if(wordMap.containsKey(letter)){
value = wordMap.get(letter);
}else {
value = 0;
}
// increment count
value++;
wordMap.put(letter, value);
}
将值放入地图或其他任何内容都不会重置它, 或者神奇地将属性重新同步到我们想要的东西(至少在java中它没有) 因此,每次我们想要修改它时,我们都必须从地图中获取值。
否则我们所做的就是在地图中放置一个随机值。在您的版本中,当遇到最后一个字母实例时,您将拥有字符数。