当前位置: 首页 > 面试题库 >

Java计算字符串中单词出现的次数

韩照
2023-03-14
问题内容

我有一个大的文本文件正在读取,因此我需要找出几个单词出现的次数。例如,单词the。我正在逐行执行此操作,每一行都是一个字符串。

我要确保我只算合法the的-在theother起不到作用。这意味着我知道我需要以某种方式使用正则表达式。到目前为止,我正在尝试的是:

numSpace += line.split("[^a-z]the[^a-z]").length;

我意识到正则表达式目前可能不正确,但我尝试过不这样做,而只是尝试查找单词的出现,the并且我也得到了错误的数字。我给人的印象是,它将字符串分割成一个数组,并且该数组被分割了多少次,就是单词在字符串中的次数。任何想法,我将不胜感激。

更新:给出一些想法,我想出了这个:

numThe += line.split("[^a-zA-Z][Tt]he[^a-zA-Z]", -1).length - 1;

虽然仍然得到一些奇怪的数字。我能够获得准确的常规计数(没有正则表达式),现在我的问题是正则表达式。


问题答案:

使用split计数不是最有效的方法,但是如果您坚持要这样做,那么正确的方法是:

haystack.split(needle, -1).length -1

如果您未将设置limit-1,则split默认为0,这将删除结尾的空字符串,这会弄乱您的计数。

从API中:

limit参数控制应用图案的次数,因此会影响所得数组的长度。[…]如果n为零,则将丢弃尾随的空字符串。

您还需要从length数组的中减去1 ,因为N出现定界符会将字符串分成多个N+1部分。

至于正则表达式本身(即needle),您可以\b在周围使用单词boundary anchors
word。如果允许word包含元字符(例如,计数"$US"),则可能需要Pattern.quote

我想出了这个:

numThe += line.split("[^a-zA-Z][Tt]he[^a-zA-Z]", -1).length - 1;

虽然仍然得到一些奇怪的数字。我能够获得准确的常规计数(没有正则表达式),现在我的问题是正则表达式。

现在的问题是,您没有计算[Tt]he出现在第一个或最后一个单词上的内容,因为正则表达式说它必须在某个字符之前/之后跟一些匹配的字符[^a-zA-Z](也就是说,您的匹配长度必须为5!
)。您不允许根本 没有 字符的情况!

您可以改用以下方法:

"(^|[^a-zA-Z])[Tt]he([^a-zA-Z]|$)"

这不是最简洁的解决方案,但可以。

这样的事情(使用否定的环顾四周)也可以:

"(?<![a-zA-Z])[Tt]he(?![^a-zA-Z])"

这样的好处是可以匹配 just
[Tt]he,而无需像以前的解决方案那样在其周围包含任何额外的字符。如果您实际上要处理所返回的令牌split,则这是相关的,因为在这种情况下,定界符不会“窃取”令牌中的任何内容。

非-split

尽管使用splitcount相当方便,但这并不是最有效的方法(例如,它正在做各种工作来返回您丢弃的那些字符串)。正如您所说,您是逐行计数的,这意味着该模式还必须重新编译并扔掉每一行。

一个更有效的方法是使用你之前做了同样的正则表达式和做平常Pattern.compilewhile (matcher.find()) count++;



 类似资料:
  • 问题内容: 我是Java字符串的新手,问题是我想计算字符串中特定单词的出现次数。假设我的字符串是: 现在,我也不想拆分它,所以我想搜索一个“雄猫”这个词。它在我的字符串中出现了两次! 我正在尝试的是: 它给了我46个计数器的价值!那么解决方案是什么? 问题答案: 您可以使用以下代码: 演示版 它匹配。 表示在找到匹配项时执行循环内给出的任何操作。并且我将by 的值递增,因此很显然,这给出了一个字符

  • 问题内容: 如何计算一个单词出现在字符串列表中的次数? 例如: 单词“句子”的结果是2 问题答案: 使用一个对象并在空白处分割单词。您可能还希望小写单词,并删除标点符号: 或使用仅与单词字符匹配的正则表达式: 现在,您有了一本包含每个单词计数的字典。 演示:

  • 问题内容: 我需要计算一个字符在一个字符串中出现的次数。 例如,假设我的字符串包含: 我想找到逗号字符的数量,即3。以及沿逗号分割后的各个字符串的数量,即4。 我还需要验证每个字符串,即str1或str2或str3或str4不应超过15个字符。 问题答案: 我已经更新了这个答案。我喜欢更好地使用比赛的想法,但是比较慢: 如果您事先知道要搜索的内容,则使用正则表达式文字;如果不知道,则可以使用构造函

  • 我需要返回一个字典,该字典计算预定列表中每个字母出现的次数。问题是我需要把大小写字母都算成一样,所以我不能用.low或.uper。 因此,例如,如果“t”是要搜索的字母,“This is a Python String”应该返回{nt':3}。 这是我目前所掌握的... 其中'letters'是条件,fullText是我正在搜索的字符串。 这里很明显的问题是,如果测试是“t”而不是“t”,我的代码

  • 问题内容: 我认为我已经很好地理解了这一点,但我认为该陈述是错误的。怎么说包含空格,加1。 编辑: 我发现(感谢Blender)可以用更少的代码来做到这一点: 问题答案: 使用方括号,而不是括号: 或: 您也可以使用:

  • 本文向大家介绍计算字符串中子串出现的次数。相关面试题,主要包含被问及计算字符串中子串出现的次数。时的应答技巧和注意事项,需要的朋友参考一下 【参考答案】