-1

配列内の重複のペアを見つけて、そのペアが存在するインデックス番号を表示できるようにする、シンプルで簡単なメソッドを作成しようとしています。

これまでのところ、使用するメソッドヘッダーと出力の例しかありません。

int Duplicates (int[] testArray){

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

返されるのは、隣接するペアのインデックス位置、つまりこの場合は5(4,4)だけです。隣接するペアがない場合は、「重複するペアが見つかりません」も印刷できるようにしたいと思います。

どうやってこのようなことに取り組み始めるのかわからないので、誰かが私が始めるのを手伝ってくれますか?

4

4 に答える 4

3

ここでLinqクエリデモをフォローしてみてください

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

var adjacentDuplicate = testArray
    .Skip(1)
    .Where((value,index) => value == testArray[index])
    .Distinct();

if (adjacentDuplicate.Any() )
{    
    // Print adjacentDuplicate
}
else
{
   // No duplicates found.
}

編集

以下は、重複のインデックスに対するLINQクエリです。

var adjacentIndex = testArray
    .Skip(1)
    .Select((value,index) => value == testArray[index] ? index : -1)
    .Where (x=> x!= -1);
于 2012-12-30T15:50:01.090 に答える
1

このLINQクエリで考えられる唯一の欠点は、破棄された値として-1を使用することです。インデックスの場合、それは常に真実ですが、私は通常それを行うことをお勧めしません。配列の次の要素が現在の要素と同じであるかどうかを確認し、trueの場合は現在のインデックスを返し、そうでない場合は-1を返し、ゼロより大きいインデックスのみを選択します。

int[] testArray = {1, 5, 6, 8, 9, 4, 4, 6, 3, 2, 2};
var duplicateIndexes = testArray.
            Select((value, index) => testArray.Length > index + 1 &&
                                     testArray[index + 1] == value ? index : -1).
            Where(index => index > 0).
            ToArray();
于 2012-12-30T15:56:25.423 に答える
0

問題を分解するときは非常に簡単です。各要素を調べて、次の要素と比較する必要があります。唯一の大きな落とし穴は、最後の要素のインデックスをインデックス+ 1と比較すると配列が不足することです。これにより、配列の範囲外の例外が発生します。これが、位置を確認する理由です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Misc
{
    class Program
    {
        static int duplicates(int[] array)
        {
            for (int i = 0; i < array.Length-1; i++)
            {
                if (array[i] == array[i+1])
                {
                    return i;
                }
            }
            return -1;
        }

        static void Main(string[] args)
        {
            int[] testArray = { 1, 5, 6, 8, 9, 4, 4, 6, 3, 2 };
            Console.WriteLine(duplicates(testArray));
            Console.ReadKey(); // block 
        }
    }
}
于 2012-12-30T15:45:04.077 に答える
-1
int previousValue = -1; //set it to something you're not expecting

for (int i=0; i <testArray.Count; i++) {
    int currentValue = testArray[i];

    if (currentValue.equals(previousValue) {
      //we have a duplicate
       duplicateList.add(i); //for the position of the duplicate
    }
    previousValue = currentValue;
}

if (duplicateList.Count == 0) {
   //no duplicates found
} else {
   return duplicateList.toArray();
}

説明-一度に1つずつ確認して、これを確認します。

forループは、配列全体を通過するまで、値iを毎回1ずつインクリメントします。

各ステップで、現在の値が前の値とチェックされます。それらが同じである場合、この位置が出力に追加されます。次に、前の値が最後の現在の値になり、ループが続行されます。

于 2012-12-30T15:41:38.813 に答える