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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

不错,你说的对:handshake
回复 使用道具 举报
这题我也想了很久,资料也找了,这个题目我现在是理解了,
因为代码是网上资料找的,自己这题刚开始真心不懂,不懂就是不懂,我也不装。
我就每个代码基本上都写了注释,现在我弄懂了。如果你实在不懂,先看我代码捋一下思路,或者跟着这个代码,自己写个伪代码
题目中的关键问题:
(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();

        }
        }
    }


回复 使用道具 举报
你学到键值对Dictionary<TKey,TValue>没,,用这个很简单的
回复 使用道具 举报
本帖最后由 别问我是谁 于 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文件的属性了。。。坑,,,害的我代码里面总显示不出来这个
回复 使用道具 举报
            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();

看没有人写第二题。我写了一个不过局限性很大,不过能实现功能。学了正则表达式后会有简单的方法吧。
希望这个对楼主有用。
要是有什么错误的地方请指出。
回复 使用道具 举报
有这么多种解决方法,学到很多哦
回复 使用道具 举报
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();
        }
    }
}
回复 使用道具 举报
好厉害!学习了
回复 使用道具 举报
我是用的正则来做的 具体如下   这个是检测所有字符的

  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();
复制代码
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马