• ベストアンサー

Listからのnull要素を削除方法は?

次のリストに入っているnull要素を削除する方法をお教え下さい。  List<String> lst = new ArrayList<String>(); while (lst.remove(null)); や for (int i=0; i < lst.size();i++) {  if (lst.get(i) == null ) lst.remove(i); } ではException in thread "main" java.lang.UnsupportedOperationException が起こります。 2011 Nov. 27.

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

実際に試してみましたが、lst.remove(null)やlst.remove(i)で問題なくnullをList<String>から削除できますよ。 for (int i=0; i < lst.size();i++) { ... }のほうは、lstにnullが連続して入っていた場合に期待したとおりに動かないと思いますが。

RASUM2
質問者

お礼

salsberry様、ありがとうございます。 今まで見ていたプログラムの中では質問のとおりなのですが、別に書いて試してみたら頂いた回答のとおりの動きです。 悲しいかな、今まで見ていたプログラムのどこが違うのかがわからない状況です。 2011 Nov. 28.

その他の回答 (4)

noname#147388
noname#147388
回答No.5

いいえ Arrays.asList で作成したリストはその状態では Iterator にしたところで削除は不可能です。 実際うちがおもったのは。 https://ideone.com/eHRHK の動作

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.4

No3回答者です。前回回答に間違いがったので、訂正 「終端条件を再計算しない」→ 自分がチェックするとき、終端に定数を入れてしまってただけでした。lst.size() なら判定の度に現在数を数えます。(他の言語と勘違いもしてたせい)。 あと、jdk1.5 では list.remove(null) は、JREのversion によっては、Unsupported が発生します。たぶん引数の型が不明となるからじゃないでしょうか。型を明示されてる変数で中身がnullなのはとおりますし。 昨日vistaで実行テストしてたんだけど、たしか新しいversionのはず(今ちょっと確認できず)で、ご質問と同様のエラー出たけど、古いjre1.5.0のままのxpの方で実行してみたらエラーになりませんでした。eclipseの設定違いの可能性もあるけど、一応そういうこともあるので、型宣言されてる変数で入れた方がベターのようです。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

ArrayList の要素番号って、途中を削除したら、番号ふり直して詰め込まれるんじゃなかったかな? for構文で先頭から検索して途中削除すると、要素数が変わるが、javaでは、終端条件を再計算しないので、要素がすでに無い(null要素ではなくて、要素番号がない)番号にアクセスしてしまうので、 Exception in thread "main" java.lang.IndexOutOfBoundsException: になる。 また、削除直後の要素は、番号が一つ減ってるので次のiでは、さらにその次にあった要素にマッチしてしまう、つまりnull連続の時に取りこぼす。 よって、後ろから検索して削除するのがよい(i=lst.size()-1; i>=0; i--)

RASUM2
質問者

お礼

mpro-gram様、ありがとうございます。 今まで見ていたプログラムの中では質問のとおりなのですが、別に書いて試してみたらforループでnull要素を削除できました。 いじっているプログラムの問題がわからない状態となりましたので、とりあえずお礼までとなります。 詳しい解説をありがとうございます。 2011 Nov. 28.

noname#147388
noname#147388
回答No.2

エスパー的感で リストの作り方は Arrays#asList(E[]) では 要素の更新がUnsupportedOperationExceptionとなるはずです。 リストからデータを削除する場合、 イテレーターにしてからイテレーターで削除してください。

RASUM2
質問者

お礼

alice_asahina様、ありがとうございます。 当該のlstは、別のクラスの中でaddメソッドで要素を入れ、クラスの返り値としてもらっているものです。これはArrays#asList(E[])での作成とは異なるかと思います。 Arrays#asList(E[])で作ったリストでもイテレータで削除できるのですね。勉強になりました。 2011 Nov. 28.

関連するQ&A