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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Cacerine 于 2014-7-15 08:43 编辑

计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
这个题目我纠结了一下都没有思路,来论坛求帮忙
还有一个题目
文本文件中存储了多个文章标题、作者,标题和作者之间用若干空格(数量不定)隔开,每行一个,标题有的长有的短,输出到控制台的时候最多标题长度10,如果超过10,则截取长度8的子串并且最后添加“...”,加一个竖线后输出作者的名字。
这个是用控制台应用程序吗????求帮忙,捋思路!

评分

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

查看全部评分

33 个回复

正序浏览
我是用的正则来做的 具体如下   这个是检测所有字符的

  1.             //定义初始字符串
  2.             string str1 = "Welcome to China!";

  3.             string str = str1.ToLower();//全部转换成小写
  4.             while (str != "")
  5.             {
  6.                 MatchCollection mc = Regex.Matches(str, str[0].ToString());//正则匹配
  7.                 Console.WriteLine("字符{0},出现了{1}次", str[0], mc.Count);

  8.                 str = Regex.Replace(str, str[0].ToString(), "");//每次匹配打印完成后都把匹配完成的字符移除,直到字符串为空 跳出循环

  9.             }

  10.             Console.ReadKey();
复制代码
回复 使用道具 举报
好厉害!学习了
回复 使用道具 举报
string str = "Welcome ,to Chinaworld";
//去掉没用的空格 标点符等 乱七八糟的东西 再用join 链接
            string str2 = string.Join("", str.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)).ToLower();//都转换成小写
            Dictionary<char, int> dic = new Dictionary<char, int>();//创建字典
            foreach (char ch in str2)
            {
                if (dic.ContainsKey(ch))
                {
                    dic[ch]++;//如果字母出现过 那就让值++ 累加
                }
                else
                {
                    dic[ch] = 1; //没有出现过 那就是第一次出现 次数为1
                }
            }
            foreach (char ch in dic.Keys)
            {
                Console.WriteLine("{0}--{1}", ch, dic[ch]);//遍历输出
            }
            Console.ReadKey();
        }
    }
}
回复 使用道具 举报
有这么多种解决方法,学到很多哦
回复 使用道具 举报
            string str = System.IO.File.ReadAllText(@"练习用.txt",Encoding.Default);
            //分格 空格和换行符的字符串  不返回空字符串数组
            string[] sArray = str.Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            //得到的应该都是 文章和作者成对的字符串。 前提文章中没有空格。
            for (int i = 0; i < sArray.Length; i += 2)
            {
                //存文章有可能改变 新建个字符串来保存来输出
                string temp;               
                if (sArray[i].Length > 8)
                {
                    //文章字符大于8个的只输出8个字符...赋值
                    temp = sArray[i].Substring(0, 8) + "...";
                }
                else
                {
                    //没有大于8个的正常输出赋值
                    temp = sArray[i];
                }
                //输出文章名|作者名 \t只是为了输出好看
                Console.WriteLine("{0}\t|\t{1}", temp, sArray[i + 1]);
            }
            Console.ReadKey();

看没有人写第二题。我写了一个不过局限性很大,不过能实现功能。学了正则表达式后会有简单的方法吧。
希望这个对楼主有用。
要是有什么错误的地方请指出。
回复 使用道具 举报
本帖最后由 别问我是谁 于 2014-7-24 21:34 编辑

/* static void Main(string[] args)
        {
            string str = "welcome to china";
            str=str.ToLower();//转为小写
            Dictionary<char, int> dic = new Dictionary<char, int>();//创建一个键值对,键是字符,值是对应的次数;
            for (int i = 0; i < str.Length ; i++)
            {
                if(str==' ') continue;//当为空格时,直接进入下一次循环
                if(!dic.ContainsKey (str))
                {
                    dic.Add(str, 1);//当键值对中没有这个键时,将其添加到键值对中,次数为1;
                }
                else //当键值对中已有这个键时
                {
                    dic[str]++; //键所对应的值加1;
                }
            }

            //遍历这个键值对
            foreach(KeyValuePair<char,int> kv in dic)
            {
                Console.WriteLine("{0}出现的次数是{1}", kv.Key, kv.Value);
            }

           Console.ReadKey();
        }
*/
-----------------------------------------------------这个界面有问题--------------------------------
竟然把我的字符串索引 i 当成了html文件的属性了。。。坑,,,害的我代码里面总显示不出来这个
回复 使用道具 举报
你学到键值对Dictionary<TKey,TValue>没,,用这个很简单的
回复 使用道具 举报
这题我也想了很久,资料也找了,这个题目我现在是理解了,
因为代码是网上资料找的,自己这题刚开始真心不懂,不懂就是不懂,我也不装。
我就每个代码基本上都写了注释,现在我弄懂了。如果你实在不懂,先看我代码捋一下思路,或者跟着这个代码,自己写个伪代码
题目中的关键问题:
(1)不区分大小写
(2)怎么按每个字符串来计数.
想清楚思路了再照着敲打一遍,如果能够理解了。就不错。先把代码理解了来。
希望能够帮到你。

代码如下:

namespace test10
{
    class Program
    {
        static void Main(string[] args)
        {
        //计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”……

        Console.WriteLine("请输入一段字母");
        string zm = Console.ReadLine();
        //将字符串都转换为小写形式
   // ---------------------------------------------------------------------------  
            zm = zm.ToLower();//把字符转换成小写字母.

            Dictionary<char,int> dict = new Dictionary<char,int>();//Dictionary.字典集合,键/值对

            char[] chs  =  zm.ToCharArray();//将字符串拆分成字符数组放入chs数组中。
  //-----------------------------------------------------------------------------

        for (int i = 0; i < chs.Length; i++)
        {
        //通过char的方法判断是否为字母,如果为字母,则进行下面的操作,
        //否则不操作
            if (char.IsLetter(chs[i]))
            {
                //如果不包含该键,则加入集合中
                if (!dict.ContainsKey(chs[i]))
                {
                    //将每个字符加入集合中对应键,其值初始为1
                    dict.Add(chs[i], 1);
                }
                else
                {
                    //否则,包含该键,只将其对应的值+1即可   值的类型为int
                    dict[chs[i]]++;
                }
            }


        }
        //循环遍历输出集合中的键 值
        foreach (KeyValuePair<char,int> kv in dict)
        {
        Console.WriteLine("字母:{0}{1}次。",kv.Key,kv.Value);
        }
        Console.ReadKey();

        }
        }
    }


回复 使用道具 举报
昕☆Rainbow 发表于 2014-7-16 12:46
这个方法很不错啊 不过14行可以去掉吧 直接初始化sum=0 结果也是一样的 这样写代码有点重复 ...

不错,你说的对:handshake
回复 使用道具 举报
路过学习长知识!
回复 使用道具 举报
好多方法啊
回复 使用道具 举报
_xixi_ 发表于 2014-7-14 10:51
第一道题,先将字符串全部转换为小写,写个循环,删除当前字符,记录下字符,在删除后的字符中查找,找到的 ...

这个方法很不错啊 不过14行可以去掉吧 直接初始化sum=0 结果也是一样的 这样写代码有点重复
回复 使用道具 举报
专属第三 发表于 2014-7-16 11:43
基础加强里边有正则表达式,好像是第15个.学习C#完全就是为了就业,而你就业的时候只掌握基本知识来做题可以 ...

?????你这是..................
回复 使用道具 举报
本帖最后由 专属第三 于 2014-7-16 11:48 编辑
  1. string s = "Welcome to Chinaworld";
  2.             int ecishu = 0;
  3.            ecishu= System.Text.RegularExpressions.Regex.Matches(s, "[Ww]").Count;

  4.            Console.WriteLine("w"+" "+ecishu);
  5.            Console.ReadKey();
复制代码
基础加强里边有正则表达式,好像是第15个.
回复 使用道具 举报
我是来学习的
回复 使用道具 举报
本帖最后由 c19t043 于 2014-7-16 08:50 编辑

首先来看第一题,
计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
我基础差,我就会用数组——2个数组,2个for循环完成这题
    class Program
    {
        static void Main(string[] args)
        {
            //计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
            string str1 = "Welcome to Chinaworld";
            Console.WriteLine(str1);
            str1 = str1.ToLower();
            //将原字符串,转换为,单个字符数组char1
            char[] char1 = str1.ToArray();
            //记录对应索引下,该字符出现过的次数
            char[] char2 = new char[char1.Length];
            for (int i = 0; i <= char1.Length - 1; i++)
            {
                int count = 0;
                for (int j = 0; j <= char1.Length - 1; j++)
                {
                    if (char1 == char1[j])
                    {
                        count++;
                    }
                }
                char2 = Convert.ToChar(count);
            }
            //打印数组char1,每种字符出现的次数,如果数组char1中有相同字符,只打印一次
            for (int i = 0; i <= char1.Length - 1; i++)
   
         {
                if (char1 != ' ')
                {
                    for (int j = 0; j <= i; j++)
                    {
                        if (char1 == char1[j] && j < i) //将char1[j]与它前面的字符比较,如果有相同就退出该循环
                        {
                            break;
                        }
                        else if (j == i)//与之前的字符比较后,仍然没相同的就输出该字符
                        {
                            Console.WriteLine(char1.ToString() + Convert.ToInt32(char2));
                        }
                    }
                }
            }
            Console.ReadKey();
        }
    }

回复 使用道具 举报
第一题, 你看下Dictionary字典这个泛型集合的用法,这题是用这种键值对集合来做的。
回复 使用道具 举报
muyyi 中级黑马 2014-7-14 20:26:42
13#
说下思路,第一题
用for遍历这个字符串
将遍历到的字符与其他每一个字符做比较,相同的时候计数器+1
也就是双重循环
注意可能出现的重复问题,比如最后结果只输出一次W 2,这可以用index值来区分,如果相同的字符出现在当前字符的前面,那么就证明不是第一次出现了,直接跳出本次循环
最后,不区分大小写应该没什么问题吧,统一转化为大写或小写再计数

第二题
截取字符串请参考substring方法

如果LZ实在看了思路还不清楚,我可以放下我当初做的源代码
不过还是请先自己思考吧

评分

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

查看全部评分

回复 使用道具 举报
当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才给你加分
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马