bool hasDuplicate = false;
int[] a = new int[] {1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
配列 A のすべての要素を配列 B の要素と比較する必要があり、B に要素が重複している場合は、hasDuplicate を TRUE に設定します。
hasDuplicates = a.Intersect(b).Any();
LINQIntersect
メソッドを使用できます - http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx
これは宿題なので、宿題の答えを出します。
SequenceEqual
確かに、LINQ を使用して、などに依存することもできますがIntersect
、それは演習のポイントではない可能性があります。
2 つの配列が与えられた場合、 を使用して配列内の要素を反復処理できますforeach
。
int[] someArray;
foreach(int number in someArray)
{
//number is the current item in the loop
}
したがって、かなり小さい 2 つの配列がある場合、最初の配列の各数値をループしてから、2 番目の配列のすべての項目をループして比較できます。それを試してみましょう。まず、配列構文を修正する必要があります。次のようになります。
int[] a = new int[] {1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
中括弧の使用に注意してください{
。構文を使用して N 次元配列を作成していました。
bool hasDuplicate = false;
int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
foreach (var numberB in b)
{
//Something goes here
}
}
これでかなり近づきます。ここから自分で試してみることをお勧めします。まだヘルプが必要な場合は、読み続けてください。
OK、基本的には数値が同じかどうかを確認する必要があります。そうである場合は、true に設定hasDuplicate
します。
bool hasDuplicate = false;
int[] a = new int[] { 8, 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
foreach (var numberB in b)
{
if (numberA == numberB)
{
hasDuplicate = true;
}
}
}
これは非常に「ブルート」フォースなアプローチです。ループの複雑さは O(n 2 ) ですが、それは問題にならない場合があります。LINQ を使用した他の回答は確かにより効率的であり、効率が重要な場合はそれらを検討できます。break
もう 1 つのオプションは、 ifが true の場合を使用してループを「停止」するかhasDuplicate
、このコードをメソッドに配置してメソッドreturn
を終了するために使用することです。
最もパフォーマンスが高いわけではありませんが、おそらく最も理解しやすいアプローチは次のようなものです。
foreach (int _a in a) { // iterate through all elements in array a (as _a)
foreach (int _b in b) { // iterate through all elements in array b (as _b)
if (_a == _b) { // if we've got a duplicate
hasDuplicates = true; // store that for later on
break; // immediately leave this loop (no point in further looking up)
}
}
if (hasDuplicates) { // if we've got a duplicate
break; // leave this loop as well (no point in further looking up)
}
}
複雑さがO(n²)
. 両方の配列の要素数が 2 倍になると、時間は 4 倍になります。
より洗練された解決策は、他のいくつかの解決策で説明されているように、事前定義された方法を使用することですが、これは宿題であるため、これらの「ショートカット」を使用することは許可されていません (または使用する必要があります)。
常に覚えておいてください。ここで解決策を見つけたとしても、それらを理解しようとし、それらをインスピレーションとして使用してから、独自のものを作成してください。それがおそらく最良の学習方法です。コピー&ペーストだけではいけません。
1行の解決策が必要ないことはわかっていますが、同じ問題に対して簡単な解決策が必要な可能性がある他のユーザーのために、私の答えを残しておきます。
を使用したくない場合は、 SequenceEqualLinq
を使用できます。
bool equal = Array1.SequenceEqual(Array2);
それが役に立てば幸い。
あなたが求めているのが学習であり、アルゴリズムを考え出そうとしているのであれば、LINQ やその他のジャズを使用しても役に立ちません。
2 つのネストされたforeach
(またはfor
、好みに応じて) ループが必要です。最初のループで 2 番目のループのメンバーと一致するメンバーが見つかったら、ブール変数を true に設定しbreak
、ループを実行します。
1行のコードでこれを行うのに役立ちますが、質問でアルゴリズムLINQ
という言葉に言及したため、それがどのように機能するかを理解することをお勧めします:)
配列をループして、各項目を 2 番目の配列の項目と比較します。存在する場合は、true を返します。そうでなければ偽。私はそれをこのような関数でラップします
public bool IsPresentInArray(int[] firstArray, int[] secondArray)
{
foreach (var itemA in firstArray)
{
foreach (var itemB in secondArray)
{
if (itemB == itemA)
{
return true;
}
}
}
return false;
}
今、私はこのようにそれを呼び出すことができます
int[] a = new int[]{1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8};
bool present= IsPresentInArray(a, b);
foreach ループについてはこちらをご覧ください
あるセット内のすべての要素を別のセットと効率的に比較するためにHashSet
、それらの 1 つを作成できます。また、最初の一致が見つかったらすぐにループを終了できます。
HashSet<int> h = new HashSet<int>(a);
foreach (int i in b) {
if (h.Contains(i)) {
hasDuplicate = true;
break;
}
}
これは、O(n*m) ソリューションであるすべての値を比較する 2 つのネストされたループを持つのと比較して、O(n+m) ソリューションです。
for
ループでやりました。ポイントは、各メンバーを array のメンバーと比較することb
です。したがって、最初a[0]
に配列内のすべてのメンバーと比較されてから、一致するものが見つかるまで同じことを繰り返します。b
a[1]
bool hasDuplicate = false;
int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (a[i] == b[j])
{
hasDuplicate = true;
}
}
}
「IndexOf」と「foreach」ループを使用してこれを作成しました。(注: 最初の 3 つの「文字列」行は、配列を作成して適切な形式にする方法の例にすぎません)。
2 つの配列を比較する場合、それらはセミコロンで区切られますが、最後の値の後には配列がありません。配列の文字列形式にセミコロンを追加すると (つまり、a;b;c が a;b;c; になります)、「x;」を使用して一致させることができます。それがどの位置にあるかに関係なく:
bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";
foreach (string s in otherArray)
{
if (myStringArray.IndexOf(s + ";") != -1) {
found = true;
break;
}
}
if (found == true) {
// ....
}