Java中的字数统计类不计算出现的每一个“那个”

我正在尝试在 Java 中创建一个 hashmap 类来计算出现的每个单词。它在大多数情况下都有效,但是当我尝试使用该段落时:


“他们给婴儿取名为苏珊。那个经理发现盒子是空的。唐娜的女儿把门开着。那个音乐家觉得这本书很有趣。那个牙医给狗起名叫菲多”


它检测除“那个”之外的所有其他单词的正确数量。“那个”在段落中出现了 3 次,但它只检测到一个“那个”。这是代码:


import java.util.*;


public class WordCounts extends ConsoleProgram

{

    public void run()

    {

        HashMap<String,Integer> h = new HashMap<String,Integer>();

        String input = readLine("Enter a string: ");

        String[] words = input.split(" ");

        for(int i=0; i<words.length; i++)

        {

            Integer num = h.get(words[i]);

            if( num == null)

                num = new Integer(1);

            else

                num = new Integer(num.intValue() + 1);


            h.put(words[i].toLowerCase(), num);

        }


        printSortedHashMap(h);

    }


    /*

     * This method takes a HashMap of word counts and prints out

     * each word and it's associated count in alphabetical order.

     *

     * @param wordCount The HashMap mapping words to each word's frequency count

     */

    private void printSortedHashMap(HashMap<String, Integer> wordCount)

    {

        // Sort all the keys (words) in the HashMap

        Object[] keys = wordCount.keySet().toArray();

        Arrays.sort(keys);


        // Print out each word and it's associated count

        for (Object word : keys) 

        {

            int val = wordCount.get(word);

            System.out.println(word + ": " + val);

        }

    }

}

如果有人可以提供帮助,我将不胜感激。提前致谢。


编辑:我在描述中不小心写了“那个”而不是“那个”;我的意思是我试图弄清楚为什么班级不计算每个“那个”。


沧海一幻觉
浏览 89回答 4
4回答

千巷猫影

好吧,它可能有很多东西......如果你不使用ignoreCase().&nbsp;还可以尝试使用它来格式化您的字符串,StringTokenizer这将使您的生活更轻松,代码更短。

素胚勾勒不出你

这里的主要问题是由以下几行引起的:h.get(words[i])和&nbsp;h.put(words[i].toLowerCase(),&nbsp;num)您正在查找HashMap原始大小写中的单词,但以小写形式存储它们。所以当你第一次看到“那个”时,你把它作为“那个”添加到地图中。下次你看到“那个”时,你瞧,它不在你的地图上!因为 Java 区分大小写,并将“That”和“that”视为不同的字符串。因此,您将“那个”重新添加到值为 1 的地图中。冲洗并重复您看到的每个重复的“那个”。您可能想要做的是在开始之前将整个输入字符串小写。您可能还想去掉所有的标点符号,这样句末的单词就不会包含句号。

侃侃尔雅

您需要像保存它一样检查小写的字符串键。Integer&nbsp;num&nbsp;=&nbsp;h.get(words[i].toLowerCase());您还需要更改 split 方法中的正则表达式以仅获取单词:String[]&nbsp;words&nbsp;=&nbsp;input.split("[&nbsp;,.?!:;]");

慕标5832272

签出代码的内联注释,以更新字符串数组中的字数。&nbsp;for(int i=0; i<words.length; i++)&nbsp; &nbsp; {// in the below line, while you are adding it to the map, the string was not converted to lowercase&nbsp; &nbsp; &nbsp; &nbsp; Integer num = h.get(***words[i].toLowerCase()***);&nbsp; &nbsp; &nbsp; &nbsp; if( num == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num = new Integer(1);&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num = new Integer(num.intValue() + 1);// here you were doing it..&nbsp; &nbsp; &nbsp; &nbsp; h.put(words[i].toLowerCase(), num);&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java