【问题标题】:How to count the frequency of numbers in an array? [duplicate]如何计算数组中数字的频率? [复制]
【发布时间】:2019-01-27 13:09:25
【问题描述】:

我有一个数组,我想计算它出现的实例数。

示例输入:

int[] a = new int[]{1,1,1,2,3,4,4};

输出:

1  3
2  1
3  1
4  2

到目前为止,我能够得到不同的但无法得到计数。

public static void arrayfrequency(int[] a)
{
    //store the distinct list
    var GetDistinct = a.Distinct().ToArray();

    foreach (int index in GetDistinct)
    {
        Console.WriteLine(index);
    }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用 GroupBy 和 Count 使用 Linq 来实现它。

    int[] a=new int[]{1,1,1,2,3,4,4};
    foreach(var item in a.GroupBy(x=>x))
    {
        Console.WriteLine($"{item.Key} {item.Count()}");
    }
    

    GroupBy 将所有相似的值组合在一起,而 Count 可以返回每个组中的项目数,实际上是重复的计数。

    一步一步理解,下面是GroupBy的图示

    现在,您需要做的就是计算循环中每个键的组数以进行显示。

    样本输入的输出

    1 3
    2 1
    3 1
    4 2
    

    【讨论】:

    • 不是我的反对意见,但问题写得不好,以至于换行符丢失了。可能就是这样。此外,有些人倾向于对神秘的 linq 答案投反对票。当有迹象表明您正在与新手打交道时,更好的做法是也使用更传统的代码提供答案......但同样:不是我的反对意见,我也写过这样的答案。
    • 谢谢@JoelCoehoorn,我想我会添加一些解释。当有人投反对票并且从不解释原因时,这很奇怪。永远无法从中吸取教训。
    【解决方案2】:

    您可以使用字典:

    public static void arrayfrequency(int[] a)
    {
        var result = new Dictionary<int,int>();
        foreach (int item in a)
        {
            if (!result.ContainsKey(item))
            {
                result.Add(item, 1);
            }
            else
            { 
                result[item]++;
            }
        }
    
        foreach(var key in result.Keys)
        {
            Console.WriteLine("{0} {1}", key, result[key]);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      相关资源
      最近更新 更多