为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2022-06-23 19:32:33
我正在尝试在 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);        }    }}如果有人可以提供帮助,我将不胜感激。提前致谢。编辑:我在描述中不小心写了“那个”而不是“那个”;我的意思是我试图弄清楚为什么班级不计算每个“那个”。
查看完整描述

4 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

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



查看完整回答
反对 回复 2022-06-23
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这里的主要问题是由以下几行引起的:

h.get(words[i])

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

您正在查找HashMap原始大小写中的单词,但以小写形式存储它们。所以当你第一次看到“那个”时,你把它作为“那个”添加到地图中。下次你看到“那个”时,你瞧,它不在你的地图上!因为 Java 区分大小写,并将“That”和“that”视为不同的字符串。因此,您将“那个”重新添加到值为 1 的地图中。冲洗并重复您看到的每个重复的“那个”。

您可能想要做的是在开始之前将整个输入字符串小写。您可能还想去掉所有的标点符号,这样句末的单词就不会包含句号。


查看完整回答
反对 回复 2022-06-23
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您需要像保存它一样检查小写的字符串键。

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

您还需要更改 split 方法中的正则表达式以仅获取单词:

String[] words = input.split("[ ,.?!:;]");


查看完整回答
反对 回复 2022-06-23
?
慕标5832272

TA贡献1966条经验 获得超4个赞

签出代码的内联注释,以更新字符串数组中的字数。


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

    {


// in the below line, while you are adding it to the map, the string was not converted to lowercase

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

        if( num == null)

            num = new Integer(1);

        else

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


// here you were doing it..

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

    }


查看完整回答
反对 回复 2022-06-23
  • 4 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信