アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のリストに入っている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.

A 回答 (5件)

実際に試してみましたが、lst.remove(null)やlst.remove(i)で問題なくnullをList<String>から削除できますよ。


for (int i=0; i < lst.size();i++) { ... }のほうは、lstにnullが連続して入っていた場合に期待したとおりに動かないと思いますが。
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/11/28 22:46

いいえ Arrays.asList で作成したリストはその状態では Iterator にしたところで削除は不可能です。



実際うちがおもったのは。

https://ideone.com/eHRHK

の動作
    • good
    • 0

No3回答者です。

前回回答に間違いがったので、訂正
「終端条件を再計算しない」→ 自分がチェックするとき、終端に定数を入れてしまってただけでした。lst.size() なら判定の度に現在数を数えます。(他の言語と勘違いもしてたせい)。

あと、jdk1.5 では list.remove(null) は、JREのversion によっては、Unsupported が発生します。たぶん引数の型が不明となるからじゃないでしょうか。型を明示されてる変数で中身がnullなのはとおりますし。
昨日vistaで実行テストしてたんだけど、たしか新しいversionのはず(今ちょっと確認できず)で、ご質問と同様のエラー出たけど、古いjre1.5.0のままのxpの方で実行してみたらエラーになりませんでした。eclipseの設定違いの可能性もあるけど、一応そういうこともあるので、型宣言されてる変数で入れた方がベターのようです。
    • good
    • 0

ArrayList の要素番号って、途中を削除したら、番号ふり直して詰め込まれるんじゃなかったかな?


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

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

お礼日時:2011/11/28 22:56

エスパー的感で


リストの作り方は Arrays#asList(E[]) では
要素の更新がUnsupportedOperationExceptionとなるはずです。

リストからデータを削除する場合、
イテレーターにしてからイテレーターで削除してください。
    • good
    • 0
この回答へのお礼

alice_asahina様、ありがとうございます。
当該のlstは、別のクラスの中でaddメソッドで要素を入れ、クラスの返り値としてもらっているものです。これはArrays#asList(E[])での作成とは異なるかと思います。

Arrays#asList(E[])で作ったリストでもイテレータで削除できるのですね。勉強になりました。
2011 Nov. 28.

お礼日時:2011/11/28 22:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!