【问题标题】:Implementing a Map to count character frequency实现一个地图来计算字符频率
【发布时间】:2013-04-12 00:58:24
【问题描述】:

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

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

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


    }

}

【问题讨论】:

    标签: java map character frequency


    【解决方案1】:

    看来问题出在这里:

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

    【讨论】:

      【解决方案2】:

      这一点是错误的

          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中它没有) 所以我们每次要修改它时都必须从映射中获取值。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-07
        • 2016-08-21
        • 1970-01-01
        • 2021-01-15
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多