0

私はの配列を持っていますint、サイズは8です。私がやりたいのはarray、ペアを検索することです(たとえば、インデックス0の番号がインデックスの番号と同じである場合5)。

2つの配列を作成しようとしましたが(2番目は最初のコピーでした)、すべてがペアになるため、意味がありませんでした。

次に、ハーフアレイを作成しようとしたので、2つarraysのサイズ4を作成して比較しました。これは、ペアが単一の配列になり得ることを解決しませんでした。

乱数arrayを使用している場合、乱数の最大値はのサイズですarray (8)

4

5 に答える 5

1

LINQ を使用できます。

int[] array = new[] { 1, 2, 3, 1, 4, 5, 6, 7, 8, 8 };
var duplicates = array
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);
foreach (var d in duplicates)
    Console.WriteLine(d);
于 2013-03-09T11:46:01.777 に答える
0

辞書を作成できます(dict[i]==>index の配列のように)

var dubs = array.Select((i, inx) => new { i, inx })
            .GroupBy(x => x.i)
            .ToDictionary(g => g.Key, g => g.Select(y => y.inx).ToList());
于 2013-03-09T11:58:31.667 に答える
0

最大値が小さい場合は、この長さのビット配列を初期化できます。元の配列を調べて、すべてのメンバーに適切なビット配列を設定します。この位置のビット配列が真の場合、ペアがあります。特定の位置が必要な場合は、int 配列を使用します。
次のようなことを試してください:

BitArray bucket = new BitArray(<<your max value>>);
foreach(int i in originalArray)
{
if(bucket[i]) return true;
bucket[i] = true;
}
于 2013-03-09T11:45:46.543 に答える
0

重複している値のリストだけでなく、その値が発生したインデックスも取得したい場合は、その LINQ to Objects クエリを使用できます。

int[] items = new[] { 1, 2, 3, 1, 4, 5, 3, 7 };

var duplicates = items.Select((e, i) => new { e, i })
                      .GroupBy(i => i.e)
                      .Where(g => g.Count() > 1)
                      .Select(g => new { Value = g.Key, Indexes = g.Select(e => e.i).ToList() })
                      .ToList(); 

duplicates次の内容の 2 つの要素が含まれています。

ここに画像の説明を入力

于 2013-03-09T11:57:32.513 に答える
0

ペアを見つける従来の方法は、配列をソートすることです (以下の方法 A)。もう 1 つの方法は、2 つのネストされたループを使用することです (方法 B)。

Tell("Method A...");
int[] a = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthA = a.Length;
Array.Sort(a);
for (int i = 1; i < lengthA; i++)
{
  if (a[i-1] == a[i])
  {
    Tell("Method A Found pair in a: "+a[i-1]+" and "+a[i]);
  }
} // for i

Tell("Method B...");
int[] b = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthB = b.Length;
for (int i = 0; i < lengthB-1; i++)
{
  for (int j = i+1; j < lengthB; j++)
  {
    if (b[i] == b[j])
    {
      Tell("Method B Found a pair in b: "+b[i]+" and "+b[j]);
    }
  } // for j
} // for i

これが出力です...

  • 方法 A...
  • 方法 A で見つかったペア: 1 と 1
  • 方法A aで見つかったペア:5と5
  • 方法A aで見つかったペア:5と5
  • 方法 B...
  • 方法 B b でペアを見つけた: 1 と 1
  • 方法 B b でペアを見つけた: 5 と 5
  • 方法 B b でペアを見つけた: 5 と 5
  • 方法 B b でペアを見つけた: 5 と 5

メソッド B がメソッド A よりも多くのペアを報告する理由がわかると思います。

于 2013-03-09T13:53:58.093 に答える