A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓泉 中级黑马   /  2013-3-3 11:48  /  1632 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有如下字符串:【"患者:“大夫,我咳嗽得很重。”     大夫:“你多大年记?”     患者:“七十五岁。”     大夫:“二十岁咳嗽吗”患者:“不咳嗽。”     大夫:“四十岁时咳嗽吗?”     患者:“也不咳嗽。”     大夫:“那现在不咳嗽,还要等到什么时咳嗽?”"】。需求:请统计出该字符中“咳嗽”二字的出现次数,以及每次“咳嗽”出现的索引位置。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

4 个回复

倒序浏览
读取text文件(字符串),用字典匹配咳嗽二字出现的地方并得到索引。
回复 使用道具 举报
写了一个简单的小例子,问题是解决了,不过应该还有更简单的办法。
            string str = "我爱的人非常的爱我,是她爱我更多,还是我爱她更多呢?";
            string[] arr = { "爱" };
            int id = 0;
            arr = str.Split(arr,StringSplitOptions.RemoveEmptyEntries);
            Console.WriteLine("一共出现了{0}次",arr.Length);
            for (int i = arr.Length - 2; i >= 0; i--)
            {
                id = str.IndexOf("爱", id + 1);
                Console.WriteLine("出现的位置分别为{0}",id);
            }
            Console.ReadKey();
回复 使用道具 举报
本帖最后由 赵文博 于 2013-3-5 01:25 编辑

楼上的解决方法可能是错误的,字符串分割得到的数组长度,并不一定是出现次数。
如果字符串以要查找的'爱'作为开始和结尾,得到的分割数组会还是原来的那个。
//在字符串str中查找字符串findstr,将查找到的位置全都放到集合posList,并返回posList
        static public List<int> FindStrs(string str, string findStr)
        {
            str = str.Trim();                                       //去掉空格
            findStr = findStr.Trim();                               //去掉空格
            List<int> posList = null;                               //初始化返回值,用来存放要查找的字符串出现位置

            if (str == "")                                          //入口参数校验
                return posList;

            if (findStr == "")                                         //入口参数校验
                return posList;


            posList = new List<int>();
            int position = 0;                                       //查找开始位置
            int strLen = str.Length;                                  //str的长度
            int findStrLen = findStr.Length;                          //要查找的字符串长度
            int index = -1;                                         //字符串查找的返回值
            while (position <= strLen)
            {
                index = str.IndexOf(findStr, position);             //从position位置开始查找字符串,找不到就会返回-1

                if (index == -1)                                    //如果没有找到,就退出循环
                    break;

                posList.Add(index);

                position = index + findStrLen + 1;                  //更新新的查找位置

            }

            return posList;
        }

        static void Main(string[] args)
        {
            string str = "爱我爱的人非常的爱我,是她爱我更多,还是我爱她更多呢?爱";     //要查找的字符串
            string findStr = "爱";                                                   //要查找的子字符串

            List<int> posList = FindStrs(str, findStr);

            if (posList != null)
            {
                for (int i = 0; i < posList.Count; i++)
                {
                    Console.WriteLine(posList);
                }

                Console.WriteLine("出现次数为" + posList.Count);

            };

            Console.ReadKey();

        }

1.png (25.25 KB, 下载次数: 37)

1.png
回复 使用道具 举报
本帖最后由 赵文博 于 2013-3-5 02:01 编辑

调用字符床分割是不可行的,比如要在“爱爱爱”中查找“爱”及出现次数,分割出的数组长度会是0
可以用正则表达式
        static void Main(string[] args)
        {
            string str = "爱1爱2爱";
            string findStr = "爱";

            Regex r = new Regex(findStr);               // 定义一个Regex对象实例
            MatchCollection  m = r.Matches(str);        // 在字符串中匹配

            if (m != null)
            {
                for (int i = 0; i < m.Count; i++)
                    Console.WriteLine(m.Index);      //输出匹配位置

                Console.WriteLine("出现次数为"+m.Count);
            }


            Console.ReadKey();

        }


1.png (25.14 KB, 下载次数: 44)

1.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马