实现Map来计算字符频率

时间:2013-04-12 00:58:24

标签: java map character frequency

基本上我正在尝试使用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);


    }

}

2 个答案:

答案 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中它没有) 因此,每次我们想要修改它时,我们都必须从地图中获取值。

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