2017-05-06 11 views
0

プログラミング中の一般的なシナリオは、リストが与えられればリストがループし、条件が真のときは同じリストのpop()要素です。リストをループして同じリストから要素をポップするときに要素を見落とさないようにする方法

このような状況では、例えば、私はリストa = [1, 2, 3, 4, 5, 6, 7, 9, 10]を持っており、質問には奇妙なリストからすべての要素を削除することが求められます。

私はちょうどこのようなアプローチをとっています。

for (int i=0; i<=a.length; i++) { 
    if (a[i]%2 != 0) { 
     a.removeElementAtIndex(i); 
    } 
} 

さて、これはリストa6件まで正常に動作します。

その後、ループインデックスは6となり、リスト内の7を参照します。 7は奇数であるため、リストから7を削除します。

今や、ループインデックスは7になり、リストの10を指します。そして、リスト内の要素9は、すでにループによってチェックされているインデックス6にあります。

この方法ではエラーが発生します。

質問:上記のような状況を引き起こさず、要素上で1つのリストとループだけを使用する方法。

+0

あなたはJSを使用しているようですね。なぜarray.filter()を使用しないのですか?これにより、aのすべての要素が繰り返し処理され、条件に一致する値のみが返されます。したがって、var results = a.filter(function(element){//要素が偶数の場合はtrueを返すロジック}); – nraduka

+0

@nradukaそうすることで新しいリストが作成され、リストをインプレースで変更したいのです。 –

+0

本当に新しいリストを作成しないと主張すれば、アイテムを削除するたびに 'i'を減らすことができます。 –

答えて

1

一般に、現在反復中のリストを変更しないことが一般的に行われています。しかし、新しいリストを使用するか、代わりにfilterメソッドを使用します。

しかし、あなたはそうのような項目を削除するたびiカウンターをdecerementできます

for (int i=0; i<=a.length; i++) { 
    if (a[i]%2 != 0) { 
     a.removeElementAtIndex(i); 
     i--; 
    } 
} 

、それが動作するはずですが、あなたはa.lengthのようなものではなく、上のサイズのスナップショットを使用する場合のみ指定された時刻のリスト。

編集:Cスタイルのためにありませんので、Pythonで、それは次のようになります。

In [3]: i = 0 

In [4]: a = list(range(12)) 

In [5]: while i < len(a): 
    ...:  if a[i] % 2 != 0: 
    ...:   a.remove(a[i]) 
    ...:   i -= 1 
    ...:  i += 1 
    ...:  

In [6]: a 
Out[6]: [0, 2, 4, 6, 8, 10] 
+0

それは無限ループです!あなた自身で試してみてください!そして、私はJSで私を減らします。しかし、Pythonのような言語では、現在の反復でのみiが減っていきます。次の反復は、その値が正常であると考えられます。 – Arunava

+0

'python'にはこのCスタイルはありません。だから、明らかに、それはPythonには関係ありません。 –

+0

@Arunavaあなたが使っている言語*は*です。あなたは言語を指定していないので、私は一般的なアプローチをしました。 –

関連する問題