整数a1
とa2
パラメータの2つの配列があり、すべてのa2
値の出現をから削除する必要がありますa1
。要素は、後続のすべての要素を1インデックス左にシフトしてカバーし、最後のインデックスに0を配置することで「削除」されます。a1
要素の元の相対的な順序を保持する必要があります。
要素のシフトに問題があります。
例:
int[] a1 = { 42, 3, 9, 42, 42, 0, 42, 9, 42, 42, 17, 8, 2222, 4, 9, 0, 1};
int[] a2 = { 42, 2222, 9};
最終結果は次のようになります。
{3, 0, 17, 8, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
だからここに私のコードがあります:
for(int i = 0; i < a1.Length; i++)
{
foreach(var element in a2)
{
if (element == a1[i])
{
for(int j = i; j < a1.Length-1; j++)
{
a1[j] = a1[j+1];
}
a1[a1.Length - 1] = 0;
}
}
}
あなたのi--;
アイテムが一致するときに使用する必要があります。アレイ全体をシフトしているからです。また、の後にbreak;
内側のforeach
ループを使用する必要がありますi--;
。
説明
1)配列を使用するi = 0
と、forとforeach(var element in a2)
両方の最初の要素はになります42
。したがって、最初に配列が1つのインデックスにシフトされます。使用していない場合はi--
、i=1
どちらを使用するかをチェックします3
が、すでに配列をシフトしているため、3
値はインデックスにあります0
。したがって、この値が一致するかどうかがチェックされることはありません。
2)そして、の使用break
。一致がすでに見つかり、配列がシフトされているため、さらにチェックする必要はありません。
コードは次のようになります。
for(int i = 0; i < a1.Length; i++)
{
foreach(var element in a2)
{
if (element == a1[i])
{
for(int j = i; j < a1.Length-1; j++)
{
a1[j] = a1[j+1];
}
a1[a1.Length - 1] = 0;
i--;
break;
}
}
}
Linqを使用できる場合は、以下のように試してください。最初にフィルター要素を取得します。次に0
、残りのインデックスを追加します。
int[] a1= { 42,3,9,42,42,0,42,9,42,42,17,8,2222,4,9,0,1};
int[] a2= { 42,2222,9};
var a3 = a1.Where(x => !a2.Contains(x)).ToArray();
for (int i = 0; i < a1.Length; i++) {
if (i < a3.Length)
a1[i] = a3[i];
else
a1[i] = 0;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加