3

次のようないくつかの配列があります。

var arr1 = new[] { "A", "B", "C", "D" };
var arr2 = new[] { "A", "D" };
var arr3 = new[] { "A", "B", };
var arr4 = new[] { "C", "D" };
var arr5 = new[] { "B", "C", "D" };
var arr6 = new[] { "B", "A", };

...など

これらすべての配列で最も一般的な要素の組み合わせを取得するにはどうすればよいですか?

この場合、それらは arr1、arr3、arr6 で発生するため A と B であり、配列 arr1、arr4、および arr5 で発生するため C と D です。

要素はあらゆる種類のコレクションに含めることができることに言及してください。ArrayLists でも。

更新うーん、私は十分に明確ではありませんでした......配列内の2つの要素の最も一般的な組み合わせ。それは私が例で示そうとしたものですが、私の質問では言及しませんでした。

ごめん :-((

4

5 に答える 5

4

各項目が各配列に 1 回しか表示されないことが確実な場合は、それらを連結してカウントを取得できます。次に例を示します。

var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate = arrs.SelectMany(a => a)
                       .GroupBy(x => x)
                       .Select(g => new { g.Key, Count = g.Count() })
                       .OrderByDescending(x => x.Count);
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);

または、クエリ構文を好む場合は、次のようになります。

var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate = 
    from a in arrs.SelectMany(a => a)
    group a by a into g
    orderby g.Count() descending
    select new { g.Key, Count = g.Count() };
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);

結果セットには 3 つの項目が含まれます。

Key, Count
"A", 4 
"B", 4 
"D", 4 

アップデート

更新された質問を考えると、次のようなものが機能するはずです。

var items = arrs.SelectMany(a => a).Distinct();
var pairs =
    from a in items
    from b in items
    where a.CompareTo(b) < 0
    select new { a, b };
var results = 
    (from arr in arrs
     from p in pairs 
     where arr.Contains(p.a) && arr.Contains(p.b)
     group arr by p into g
     orderby g.Count() descending
     select g.Key)
    .First();

ここでのロジックは次のとおりです。

  1. 最初に、任意の配列内のすべての個別のアイテムを見つけます
  2. 次に、検索するアイテムのすべてのペアを見つけます
  3. そのペアを含む配列のリストによってグループ化されたすべてのペアを取得します
  4. グループごとに、各ペアを含む配列の数で降順​​に並べ替えます
  5. 最初のペアを返す
于 2013-11-14T15:06:28.683 に答える
1

要素をインデックスとして格納し、出現回数を値として格納する Dictionary を使用します。各リストを繰り返し、出現回数を数えます。

于 2013-11-14T15:04:56.837 に答える
0

探しているものを明確に定義していないため、質問が不明確です。一般に、すべての配列を 1 つの大きな配列に結合し、個別の要素を数えることができます。次に、要素を順序付けることで、「最も一般的な」ものを使用して意図したことを実行できます。

static void Main()
{
    var arr1 = new[] { "A", "B", "C", "D" };
    var arr2 = new[] { "A", "D" };
    var arr3 = new[] { "A", "B", };
    var arr4 = new[] { "C", "D" };
    var arr5 = new[] { "B", "C", "D" };
    var arr6 = new[] { "B", "A", };
    List<string> combined = Combine(arr1, arr2, arr3, arr4, arr5, arr6);

    var ordered = combined.OrderBy(i => i);//sorted list will probably help other functions work more quickly such as distinct
    var distinct = ordered.Distinct();

    var counts = new Dictionary<string, int>();

    foreach (var element in distinct)
    {
        var count = ordered.Count(i => i == element);
        counts.Add(element, count);
    }

    var orderedCount = counts.OrderByDescending(c => c.Value);

    foreach (var count in orderedCount)
    {
        Console.WriteLine("{0} : {1}", count.Key, count.Value);
    }
    Console.ReadLine();
}

private static List<string> Combine(string[] arr1, string[] arr2, string[] arr3, string[] arr4, string[] arr5, string[] arr6)
{
    List<string> combined = new List<string>();
    combined.AddRange(arr1);
    combined.AddRange(arr2);
    combined.AddRange(arr3);
    combined.AddRange(arr4);
    combined.AddRange(arr5);
    combined.AddRange(arr6);
    return combined;
}

出力: A : 4、B : 4、D : 4、C : 3

于 2013-11-14T15:21:59.207 に答える
0
var arr1 = new[] { "A", "B", "C", "D" };
var arr2 = new[] { "A", "D" };
var arr3 = new[] { "A", "B", };
var arr4 = new[] { "C", "D" };
var arr5 = new[] { "B", "C", "D" };
var arr6 = new[] { "B", "A", };

var results = new List<IEnumerable<string>>() { arr1, arr2, arr3, arr4, arr5, arr6 }
                                .Select(arr => arr.Distinct())
                                .SelectMany(s => s)
                                .GroupBy(s => s)
                                .Select(grp => new { Text = grp.Key, Count = grp.Count() })
                                .OrderByDescending(t => t.Count)
                                .ToList();

{A, 4}、{B, 4}、{D, 4}、{C, 3}

于 2013-11-14T15:06:16.247 に答える