这是我的数组:
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
如果我想让程序找到该阵列的模式,我该写些什么?
这是LINQ解决方案:
int mode = myArray
.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.First() // throws InvalidOperationException if myArray is empty
.Key;
这myArray
将按值对元素进行分组,按每个组中的值数对组进行排序,然后获取第一个组的值。如果存在多个模式,则采用的任何一种先发生(具有最低的索引)myArray
。
如果可能有多个模式,而您又需要所有这些模式,则可以改用此变体:
var groups = myArray
.GroupBy(x => x)
.Select(g => new { Value = g.Key, Count = g.Count() })
.ToList(); // materialize the query to avoid evaluating it twice below
int maxCount = groups.Max(g => g.Count); // throws InvalidOperationException if myArray is empty
IEnumerable<int> modes = groups
.Where(g => g.Count == maxCount)
.Select(g => g.Value);
这将按myArray
值对元素进行分组,查找任何组中的最大值数目,并获取具有该最大值数目的每个组的值。
如果myArray
是非常大的,那么第二个版本(这是O(n))可能会比第一版本快(这是O(n log n)的,由于排序)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句