首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算字符出现的次数

计算字符出现的次数
EN

Code Review用户
提问于 2014-09-25 14:41:15
回答 5查看 45.1K关注 0票数 11

我编写了一些使用SortedDictionary来计算字符串中字符出现次数的代码。

如何改进这段代码?我该怎么做?任何建议都是有帮助的。

代码语言:javascript
复制
    static void Main(string[] args)
    {
        string longText = @"The quick brown fox jumps over the lazy dog";

        var count = CharacterCount.Count(longText);

        foreach (var character in count)
        {
            Console.WriteLine("{0} - {1}", character.Key, character.Value);
        }
    }

CharacterCount类:

代码语言:javascript
复制
class CharacterCount
{
    public static SortedDictionary<char, ulong> Count(string stringToCount)
    {
        SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();

        foreach (var character in stringToCount)
        {
            if (!characterCount.ContainsKey(character))
            {
                characterCount.Add(character, 1);
            }
            else
            {
                characterCount[character]++;
            }
        }

        return characterCount;
    }

这是输出:

EN

回答 5

Code Review用户

回答已采纳

发布于 2014-09-25 15:27:23

您也可以使用林克做同样的事情:

代码语言:javascript
复制
var counts = longText.GroupBy(c => c) // put each character into a "bucket"
                     // order the buckets alphabetically
                     .OrderBy(c => c.Key);
                     // then convert to dictionary where key = character, value = count
                     .ToDictionary(grp => grp.Key, grp => grp.Count()) 

为了方便/可读性,可以将其转换为string上的扩展方法:

代码语言:javascript
复制
static class Extensions 
{
    public static Dictionary<char, int> CharacterCount(this string text)
    {
        return text.GroupBy(c => c)
                   .OrderBy(c => c.Key)
                   .ToDictionary(grp => grp.Key, grp => grp.Count());
    }
}

然后像这样调用它:

代码语言:javascript
复制
var longText = @"The quick brown fox jumps over the lazy dog";

var counts = longText.CharacterCount();

但是,请注意,上面的内容不会产生一个排序字典,也就是说,如果您以后要向它添加另一个键/值,那么顺序将不再被维护。此时您可以重新排序,也可以使用SortedDictionary构造函数创建排序字典。

票数 13
EN

Code Review用户

发布于 2014-09-25 15:48:57

您可以去掉count变量,因为这里并不真正需要它,只会给main方法增加混乱,您只需在foreach声明中调用.Count方法。

所以这个:

代码语言:javascript
复制
static void Main(string[] args)
{
    string longText = @"The quick brown fox jumps over the lazy dog";

    var count = CharacterCount.Count(longText);

    foreach (var character in count)
    {
        Console.WriteLine("{0} - {1}", character.Key, character.Value);
    }
}

变成这样

代码语言:javascript
复制
static void Main(string[] args)
{
    string longText = @"The quick brown fox jumps over the lazy dog";

    foreach (var character in CharacterCount.Count(longText))
    {
        Console.WriteLine("{0} - {1}", character.Key, character.Value);
    }
}
票数 5
EN

Code Review用户

发布于 2014-09-25 19:03:07

在您的ulong中使用SortedDictionary<T,TK>,这表示最大值18,446,744,073,709,551,615,这对您的情况来说似乎有点过分。我很肯定一个int就足够了,因为最大值是2,147,483,647。

另外,您的方法名为Count,很难假设它将返回一个SortedDictionary<char,ulong>。我认为它将返回一个int,因为在.Net框架中名为Count的所有方法。您可以将其命名为GetNumberOfOccurencePerCharacter,否则Count似乎将返回string中的字符数,而不是每个字符在string中出现的次数。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档