确定int数组中最常见的元素

时间:2014-05-26 00:07:51

标签: c# arrays linq

我在这里找到的关于这个问题的答案只回答了一个最常见的元素。

我有一个填充随机数的int [10](0到20之间),我需要找到模式。但是随机的,有时会有多种模式,有时则没有。

目前我找到该模式的代码是:

int mode = numArray.GroupBy(v => v)
                    .OrderByDescending(g => g.Count())
                    .FirstOrDefault()
                    .Key;

这很有效,但如果说12和8都是最常见的,那么它只显示其中一个。

5 个答案:

答案 0 :(得分:4)

我不喜欢这些代码,但认为这是最有效的方式:

int temp = -1;
var mode = numArray.GroupBy(v => v)
                   .OrderByDescending(g => g.Count())
                   .TakeWhile(g => {
                         if(temp == -1)
                             temp = g.Count();
                         return temp == g.Count(); })
                   .Select(g => g.Key)
                   .ToArray();

答案 1 :(得分:4)

var groups = numArray.GroupBy(v => v)
                .OrderByDescending(g => g.Count())
                .ToList();

IEnumerable<int> modes = groups.TakeWhile(g => g.Count() == groups.First().Count())
                               .Select(g => g.Key);

答案 2 :(得分:3)

一种(也许)更优雅的方法包括两次分组,一次按值,然后按计数:

var modes = numArray.GroupBy(i => i)
    .GroupBy(numGroup => numGroup.Count(), numGroup => numGroup.Key)
    .OrderByDescending(supergroup => supergroup.Key)
    .First().ToArray();

答案 3 :(得分:1)

完成1次传球。得胜于最喜欢的答案!

   public class PopularNumber
    {
        private Int32[] numbers = {5, 4, 3, 32, 6, 6, 3, 3, 2, 2, 31, 1, 32, 4, 3, 4, 5, 6};

        public PopularNumber()
        {
            Dictionary<Int32,Int32> bucket = new Dictionary<Int32,Int32>();
            Int32 maxInt = Int32.MinValue;
            Int32 maxCount = 0;
            Int32 count;

            foreach (var i in numbers)
            {
                if (bucket.TryGetValue(i, out count))
                {
                    count++;
                    bucket[i] = count;
                }
                else
                {
                    count = 1;
                    bucket.Add(i,count);
                }

                if (count >= maxCount)
                {
                    maxInt = i;
                    maxCount = count;
                }

            }

            Console.WriteLine("{0},{1}",maxCount, maxInt);

        }
    }

答案 4 :(得分:0)

static int[] GetMostCommonIntegers(int[] nums)
{
    return nums
        .ToLookup(n => n)
        .ToLookup(l => l.Count(), l => l.Key)
        .OrderBy(l => l.Key)
        .Last() 
        .ToArray();
}   

此解决方案可以处理多个数字出现相同次数的情况:

[1,4,5,7,1] => [1]
[1,1,2,2,3,4,5] => [1,2]
[6,6,6,2,2,1] => [6]