2

これが私の配列です:

int myArray = new int[5];

myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;

プログラムにこの配列のモードを見つけさせたい場合、何を書かなければなりませんか?

4

1 に答える 1

8

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非常に大きい場合、2 番目のバージョン (O(n)) は最初のバージョン (ソートにより O(n log n)) よりも高速になる可能性があります。

于 2013-11-02T02:32:44.657 に答える