C++,计算字符串中重复的单词并显示

标签 c++ arrays string

我有字符串说“walk talk,can't won't Won't woN'T talk.”我想计算重复的单词并显示。 注意:不区分大小写。

我用过定界符

strtok(string, ",.;:\"!? -_\n\t*()@#=+");

并保存在

char *temp[100];

现在如何检查单词的重复?并显示如下

3 won't
2 talk
1 can't
1 walk

它应该从最高重复率到最低重复率显示。如果重复相同则显示字母顺序。

抱歉我的英语不好。

最佳答案

使用 std::string 来保存 strtok() 的结果.然后创建一个 std::map<string, int>保存字符串(键)出现的次数。

您可以使用以下内容填充 map :

std::map<string, int> myMap;
myMap[tokenizedWord]++; //Increase count of word.

然后您可以循环遍历 map 内容并打印出整数值大于 2 的任何地方。

for (std::map<string, int>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter)
{
    if (iter->second > 1)
        std::cout << "Duplicated word: " << iter->first << " count = " << iter->second;
}

我会让你弄清楚如何按顺序遍历它。您可以将值放在 vector 或其他东西中并使用 std::sort在打印或其他任何你喜欢的东西之前。遗憾的是, map 是关联容器,您无法对它们进行排序,因为这会破坏它们的内部顺序。

std::map 的背景信息

映射是一个关联数组,这意味着每个键都映射到一个特定的值,并且键是唯一的。实际上,您可以创建键不唯一的多重映射,因此这很重要。

基本上,由于键是唯一的,您只需将键用作数组索引即可访问或创建元素。

例如:

//Create a map and insert a couple things into it - prices of meat?
std::map<string, float> myMap;
myMap["Chicken"] = 4.99;
myMap["Turkey"] = 6.99;

//Retrieve the price of something using the key.
std::cout << "Chicken costs " << myMap["Chicken"] << std::end;

您也可以在 map 上执行标准的插入和定位操作,但关联数组语法更简单,何必呢? :)

PS: 为了完整回答您的评论,以防万一,myMap[tokenizedWord]++ 末尾的++ 只是说增加为该键存储的整数值的值1. 你也可以做 myMap[tokenizedWord] = myMap[tokenizedWord] + 1 或者你也可以做 myMap[tokenizedWord] += 1.

关于C++,计算字符串中重复的单词并显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833882/

相关文章:

c++ - c_str 函数有什么用?

arrays - 在字符串数组中搜索多个单词(或字符)(swift)

c++ - 在 if-else if 链中使用 Likely()/Unlikely() 预处理器宏

c++ - VS 2015编译cocos2d-x 3.3报错 "fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration"

arrays - 如何在嵌套的 JSON 值上使用 SwiftyJSON

android - 一一检查ArrayList of Strings是否包含50个不同的String

python - 使用空格分隔符和最大长度拆分字符串

c - 顺序搜索在 C 中不起作用

c++ - 如何使用graphics.h获取光标相对于窗口的位置?

java - 如何让代码在递归后只运行一次?