0

整数配列の上位3つの最大繰り返し数を見つけたいですか?

以下は私が試したコードの一部ですが、目的の結果が見つかりませんでした。

static void Main(string[] args)
    {

      int[,] numbers = {
                           {1, 2, 0, 6 },
                           {5, 6, 7, 0 },
                           {9, 3, 6, 2 },
                           {6, 4, 8, 1 }
                        };           
        int count = 0;
        List<int> checkedNumbers = new List<int>();
        foreach (int t in numbers)
        {
            if (!checkedNumbers.Contains(t))
            {
               foreach (int m in numbers)                   
               {
                   if (m == t)                        
                      {   
                         count++;
                      }
                }
                Console.WriteLine("Number {0} is Repeated {1} Times ", t, count);
               count = 0;
                checkedNumbers.Add(t);
            }           
       }
        Console.ReadLine();
    }
4

4 に答える 4

5

GroupByLINQから使用しOrderByDescendingて、各グループの数に基づいて使用できます。

var result = list.GroupBy(i => i)
                 .OrderByDescending(g => g.Count())
                 .Select(g => g.Key)
                 .Take(3);

編集:コードを使用OfTypeして、マトリックスをフラット化してから、上記のコードを使用できます。

int[,] numbers = {
                       {1, 2, 0, 6 },
                       {5, 6, 7, 0 },
                       {9, 3, 6, 2 },
                       {6, 4, 8, 1 }
                 };

var list = numbers.OfType<int>();
于 2012-09-12T05:09:03.283 に答える
1
int[] numbers = {1, 2, 3, 5, 6, 32, 2, 4, 42, 2, 4, 4, 5, 6, 3, 4};
var counts = new Dictionary<int, int>();
foreach (var number in numbers)
{
    counts[number] = counts[number] + 1;
}
var top3 = counts.OrderByDescending(x => x.Value).Select(x => x.Key).Take(3);
于 2012-09-12T05:06:32.630 に答える
1

ヒント:

LINQを使用してこれを行うことができます。
これは、ほとんどのfrequest発生要素を見つけるためのコードです:-

List<int> list = new List<int>() { 1,1,2,2,3,4,5 };

// group by value and count frequency
var query = from i in list
            group i by i into g
            select new {g.Key, Count = g.Count()};

// compute the maximum frequency
int frequency = query.Max(g => g.Count);

// find the values with that frequency
IEnumerable<int> modes = query
                              .Where(g => g.Count == frequency)
                              .Select(g => g.Key);

// dump to console
foreach(var mode in modes) {
    Console.WriteLine(mode);
}

同じように、他の2つも見つけることができます。

于 2012-09-12T05:07:33.230 に答える
1

既存の回答のどれも説明を提供していないことがわかりますので、説明しようと思います。

あなたがする必要があるのは、各アイテムが配列に現れる回数を数えることです。そのためには、さまざまな方法(辞書、linqなど)があります。おそらく、番号を含む辞書を使用するのが最も簡単であり、それがどのように表示されたのでしょうか。

int numbers[] = {1, 3, 6, 10, 9, 3, 3, 1, 10} ;
Dictionary<int, int> dic = new Dictionary<int, int>();

次に、数字のすべての要素を繰り返し処理し、辞書に追加します。すでに追加されている場合は、カウント値を増やすだけです。

foreach (var i in numbers)
{
    dic[i]++; // Same as dic[i] = dic[i]+1;
}

新しいアイテムが存在しない場合、辞書は自動的に新しいアイテムを追加するので、簡単に行うことができますdic[i]++;

次に、最も高い3つの値を取得する必要があります。繰り返しますが、これを行うには多くの方法がありますが、最も簡単な方法はそれをソートすることです。

var sorted_dic = dic.OrderByDescending(x => x.Value);

これで、の最初の3つの項目sorted_dicが、探している3つの値になります。これら3つだけを取得するには、さまざまな方法があります。たとえば、次のTake方法を使用します。

var first_3 = sorted_dic.Take(3);

これで、これら3つの値を繰り返し処理して、たとえば画面に印刷することができます。

foreach (var i in first_3)
{
    Console.Write("{0} appeared {1} times.", i.Key, i.Value);
}
于 2012-09-12T05:27:02.603 に答える