0

基本上我正在尝试使用字符串作为键(单个字符)和整数变量(字符频率)来实现映射。

程序运行时我得到不准确的频率。有谁知道我哪里出错了?

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);


    }

}
4

2 回答 2

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++);
}
于 2013-04-12T01:03:29.480 回答
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 中它没有)所以我们每次想要修改它时都必须从映射中获取值.

否则我们所做的就是在地图中放置一个随机值。在您的版本中,您将拥有的是遇到最后一个字母实例时的字符数。

于 2013-04-12T01:02:51.460 回答