8

さて、オブジェクトのプリミティブ配列があり、それらを配列から削除できないため、代わりに配列内のオブジェクトの位置を null に変更します。ただし、配列内の各オブジェクトを反復処理する場合は、次のようにします。

for (Derp derp : derps){
     derp.herp++;
}

私はこのようなことをしなければなりませんか?

for (Derp derp : derps){
     if (derp != null){
     derp.herp++;
     }
}

それとも、私が最初に持っていた方法で大丈夫ですか?for ループは、Derp オブジェクトとして宣言したため、null オブジェクトではなく、Derp オブジェクトを反復処理するだけでよいことを「認識」しますか? それとも、私が言ったようにそれを Derp オブジェクトとして扱い、Derp 以外のオブジェクトを反復しようとするとエラーが発生するのでしょうか? それともnullはまだDerpオブジェクトですか?それはどれで、どのコードを使用できますか?

または、プリミティブ配列からオブジェクトを削除し、null オブジェクトを残さず、実際にプリミティブ配列の長さを短くするにはどうすればよいですか?

4

6 に答える 6

6

これの方が良い。

for (Derp derp : derps){
     if (derp != null){
     derp.herp++;
     }
}

最初のものは nullpointer 例外をスローします。null

プリミティブ配列からオブジェクトを削除し、null オブジェクトを残さないようにするにはどうすればよいですか。

配列内のその要素にメモリが割り当てられると、少なくともできることはそれを作成することnullです。

実際にプリミティブ配列の長さを短くしますか?

いいえ、自己宣言中は固定です。減速後は長さを変更できません。

アレイはずっと前に死にました。あなたの最善の策はList、どちらの利点があるかです

  • Positional access— リスト内の数値位置に基づいて要素を操作します。これには、get、set、add、addAll、remove などのメソッドが含まれます。
  • Search— リスト内の指定されたオブジェクトを検索し、その数値位置を返します。検索メソッドには、indexOf と lastIndexOf があります。
  • Iteration— Iterator セマンティクスを拡張して、リストのシーケンシャルな性質を利用します。listIterator メソッドは、この動作を提供します。
  • Range-view— sublist メソッドは、リストに対して任意の範囲操作を実行します。
于 2013-10-29T06:33:44.207 に答える
1

いくつかのオプションがあります:

  1. 2 番目の例のように、null を明示的にチェックできます。

  2. インデックスによる高速アクセスが重要でない場合は、LinkedList. リンクされたリストから要素を安価に削除します。

  3. 要素の順序が重要でない場合は、Set.

于 2013-10-29T06:36:21.357 に答える
0

拡張 for ループのしくみ

for (Derp derp : derps){
  derp.herp++;
}

に変換します

for(Iterator<Derp> i = derps.iterator(); i.hasNext(); ) {
  Derp element = i.next();

}

あなたはあなたよりもそのコレクションを持っnull check on collectionている必要があります。any operation on the elementsshould have null check on the elements too

イテレータは要素が存在するかどうかをチェックしているため、存在しない場合null checkNULL POINTER EXCEPTIONが発生します

こんな感じで使って、

if(derps != null){
  for (Derp derp : derps){
    if(derp != null)
      derp.herp++;
  }
}

強化された for ループの実装方法については、こちらをご覧ください

于 2013-10-29T06:36:11.687 に答える