QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

配列から任意の項目を削除する方法について

自作JavaBeansクラスの配列から任意の位置のObjectを
削除しようと思い、以下のようなコーディングをしました。

TestBean[] tbs = 〜〜〜;
List rtnList = Arrays.asList(tbs);
for(int i=0; i<tbs.length; i++){
 if(ある条件){
  rtnList.remove(i);
 }
}
tbs = (TestBean[])rtnList.toArray();

実際に実行すると、removeするところで
以下のようなExceptionが発生してしまいます。

java.lang.UnsupportedOperationException
 at java.util.AbstractList.remove(AbstractList.java:167)

まったく別のアプローチでもかまわないのですが、
配列から簡単に任意の項目を削除する方法は無いでしょうか?

質問者:ア太郎

回答

まったく別のアプローチでもかまわないのですが、
配列から簡単に任意の項目を削除する方法は無いでしょうか?

コピーを作り必要な値をコピー 、削除フラグを設けるとか

投稿者:七味唐辛子

編集 履歴 (0)

ア太郎さんこんにちは。
Arrays#asList()で返されるListオブジェクトはremove()に対応していない為
UnsupportedOperationExceptionが発生していると思われます。
List rtnList = new ArrayList();
rtnList.addAll(Arrays.asList(tbs));
のようにしてはどうでしょうか。

投稿者:kit

編集 履歴 (0)

Arrays.asList の返す List が remove メソッドを実装していないからです。
(remove は任意のオペレーション)
この List を remove を実装している ArrayList か LinkedList でラップすれば OK だと思います。
# このエラーについては

ところで、前の質問で「基本的には今までも投稿したところには結果報告も行うように
しています。 」というのはどうなりました?

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9066&forum=12

投稿者:顔爺

編集 履歴 (0)

kitさんの書き込み (2004-03-12 18:03) より:

List rtnList = new ArrayList();

rtnList.addAll(Arrays.asList(tbs));

ArrayList(Collection c) のコンストラクタがありますよ。

#読みにくい個所を訂正しました。
[ メッセージ編集済み 編集者: でゅうく 編集日時 2004-03-12 18:13 ]

投稿者:でゅうく

編集 履歴 (0)

ご質問の件は解決されたと思うのですが、下記引用部分は上手くいきましたか?

ア太郎さんの書き込み (2004-03-12 17:38) より:

tbs = (TestBean[])rtnList.toArray();

投稿者:でゅうく

編集 履歴 (0)

みなさん、レスありがとうございます。
皆さんの意見を参考に、以下のような形で解決しました。
改良の余地はまだまだありそうですが、、、

TestBean[] tbs = 〜〜〜;
List rtnList = new ArrayList(Arrays.asList(tbs));
int zure = 0;
for(int i=0; i<tbs.length; i++){
 if(ある条件){
  rtnList.remove(i-zure);
  ++zure; //消すごとにズレが生じるので
 }
}
TestBean[] tbs2 = new TestBean[rtnList.size()];
tbs = (TestBean[])rtnList.toArray(tbs2);

顔爺さん>
前回の質問の結果報告も既に行ってあると思いますが。

投稿者:ア太郎

編集 履歴 (0)

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9066&forum=12

ローカルの設定はセキュリティーやパッチだと思われますが、
よくわかりません。
何かわかったらご連絡したいと思います。
よく分からないローカル設定とやらはもう放置中?
といいますか、結局うまくいったんですか?
それすら判断できませんが。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9869&forum=12&3

Session無効化のタイミングで、
HttpSessionBindingEventも発生するとは知りませんでした。
試してみます。
試した結果は?
こちらも結局解決したのか判断できないのですが。

Application スコープにユーザ情報ってあまり聞かないのですが
よろしければどういう用途か教えていただけませんか?
どういう用途なのかそんなことを説明するつもりはない?

もしかして、アドバイスを受けて、
「分かりましたやってみます」
が結果報告だと思っているのでしょうか・・・?

私の認識ではその「やってみた」結果を報告することが結果報告なのですが^^;
進展しないのならしないで、「結局うまくいきませんでした」になるでしょうし。

投稿者:TomScissors

編集 履歴 (0)

改良の余地はまだまだありそうですが、、、

List の要素に順番にアクセスするのであれば Iterator を使うべきです。そうすれば、ずれの計算なども不要です。

TestBean[] tbs = 〜〜〜;
List rtnList = new ArrayList(Arrays.asList(tbs));
for (Iterator i = rtnList.iterator(); i.hasNext();){
 if(ある条件判定(i.next())){
  i.remove();
 }
}

[ メッセージ編集済み 編集者: さ 編集日時 2004-03-13 14:34 ]

投稿者:さ

編集 履歴 (0)

ささんの書き込み (2004-03-13 14:34) より:

List の要素に順番にアクセスするのであれば Iterator を使うべきです。そうすれば、ずれの計算なども不要です。

ついでにいうのなら、ArrayList を使うより LinkedList を使うべきだと思います。
配列の要素の削除より連結リストの要素の削除の方が軽い処理ですから。

投稿者:顔爺

編集 履歴 (0)

「配列からリストを生成、そのリストを舐めながら不要な要素を削る」よりも、
「配列を舐めながら、必要な要素だけリストに追加する」ほうがシンプルだと思いますが。
いかが?

# ひらがなの「さ」さんとは別人です。

投稿者:佐々木

編集 履歴 (0)

TomScissorsさん>

私の認識ではその「やってみた」結果を報告することが結果報告なのですが^^;

おっしゃる通りだと思います。
「基本的に結果報告を行っている」というのは訂正します。
「質問しっぱなしにはしていない」ということを実践しています。
できていないときもあるので「基本的に」とつけていました。

書き方が不十分、報告内容が足りないと言われればその通りですが、
(個人的ですが)時間と状況が許す限りで、できるだけ結果報告もしようと思っています。
深く調べることが出来ない状況では、お礼だけでもするようにしています。
甘いといわれるかもしれませんが、これが質問者の最低限のマナーだと考えています。

また、常に掲示板を確認しているわけではないので、
お礼や結果報告をした後ではあまり見ていません。

投稿者:ア太郎

編集 履歴 (0)

サさんの書き込み (2004-03-13 17:28) より:

「配列からリストを生成、そのリストを舐めながら不要な要素を削る」よりも、

「配列を舐めながら、必要な要素だけリストに追加する」ほうがシンプルだと思いますが。

いかが?

たしかにその方がベターですね。
# 対抗して(笑)、もっとシンプルな方法がないか考えてみたけど、思い付かない....

投稿者:顔爺

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。