web-dev-qa-db-ja.com

Java、ただし最初の要素のArrayListからすべてを削除する方法

私はJavaプログラミングに不慣れで、phpでプログラミングしているので、このタイプのループに慣れています。

int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(n);
}

それで、最初のアイテム以外のすべてを削除したいのに、なぜこれが機能しないのですか?取得すると、削除後、配列キーが再配置されますか?

18
dfilkovi

取得すると、削除後、配列キーが再配置されますか?はい、位置1のアイテムを削除した後、位置2にあったアイテムは位置1にあります。

あなたはこれを試すことができます:

Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item
22
Daniel Engmann

あなたが使うことができます

mapOverlays.subList(1, mapOverlays.size()).clear();
100
Adam Crume

逆にやってみませんか?

int size = itemizedOverlay.size();
for(int n=size-1;n>0;n--)
{
    mapOverlays.remove(n);
}
7
Plamena

最初の要素だけを含む新しいArrayListを作成する方が速いと思います。何かのようなもの :

E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);
4
Agemen

ArrayListには、0からsize() - 1までの整数インデックスがあります。あなたができること:

_int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(1);
}
_

これはおそらくPHPに期待するものと一致します。変化する1番目の要素を継続的に削除することで機能します。ただし、内部アレイを常にシフトダウンする必要があるため、パフォーマンスは低下します。 clear()を使用するか、逆の順序で実行することをお勧めします。

残念です removeRange 保護されているのは、このタイプの操作に便利だからです。

2

シンプル。

mapOverlays = Collections.singletonList(mapOverlays.get(0));
2
Jim

mapOverlaysArrayList参照を保持していると仮定しています。

mapOverlaysListまたはArrayListとして宣言されている場合、mapOverlays.remove(n)はオブジェクトを削除するremove(int)メソッドを参照します。与えられたオフセット。 (ここまでは順調ですね ...)

remove(int)を使用して配列のnth要素を削除すると、位置_n + 1_で始まり、とりわけ要素が1つ下に移動します。したがって、ほとんどの場合、実行していることは実際には機能しません。 (実際、削除したい要素の約半分を削除してから、IndexOutOfBoundsExceptionを取得する可能性があります。)

最善の解決策は次のいずれかです。

_    for (int i = size - 1; i > 0; i--) {
        mapOverlays.remove(i);
    }
_

または

_    tmp = mapOverlays.remove(0);
    mapOverlays.clear();
    mapOverlays.add(tmp);
_

(最初のソリューションは常にリストの最後から削除され、削除された要素によって残された穴を埋めるために要素をコピーする必要がないことに注意してください。パフォーマンスの違いは、大きなArrayListでは重要です。)

ただし、mapOverlaysCollectionとして宣言されている場合、remove(n)remove(<E>)オーバーロードにバインドされ、引数に一致するオブジェクトが削除されます。宣言された型に応じて、これによりコンパイルエラーが発生するか、intIntegerとして自動ボックス化され、(おそらく)何も削除されません。 GOTCHA!

1
Stephen C
int size = mapOverlays.size();
for(int n=0;n<size;n++)
{
    mapOverlays.remove(n);
}

Javaでは、mapOverlaysがリストの場合、最初のインデックスとして0から始まります。したがって、forループではn = 0です。

0
Sonal Patil

Whileループを使用して、最初の要素の後のすべてを削除します。

while (mapOverlays.size() > 1) {
    mapOverlays.remove(1);
}

[〜#〜] edit [〜#〜](Adam Crumeからのコメントを参照)

パフォーマンスが問題になる場合は、これを使用する必要があります

while (mapOverlays.size() > 1) {
    mapOverlays.remove(mapOverlays.size()-1);
}

少しでもマイクロ最適化

int last = mapOverlays.size() - 1;
while (last >= 1) {
    mapOverlays.remove(last);
    last -= 1;
}



パフォーマンスが本当に問題である(そしてリストに多くの要素がある)場合は、sublistソリューションを使用する必要があります。読むのは少し難しいですが、リストインスタンスを再作成できない場合(他の場所で参照されている場合)、おそらく最速の解決策です。

0
user85421

配列の代わりに_Java.util.List_実装を使用している場合、何かを削除するたびに配列のサイズが小さくなり、_n+1_アイテムがnアイテムに置き換わります。このコードは、ArrayIndecOutOfBoundsExceptionがリストの最後のインデックスよりも大きくなると、最終的にnになります。

Javaにも配列型があり、そのサイズは変更できません。

_Object[] mapOverlay = //initialize the array here
int size = mapOverlay.length;
for(int n=1;n<size;n++)
{
    mapOverlay[n] = null;
}
_

PHPはわかりませんが、これはあなたが求めている動作に近いようです。ただし、Listの実装は、配列よりも柔軟で快適に使用できます。

編集:ここにList.remove(int)のJavadocへのリンクがあります: http://Java.Sun.com/javase/6/docs/api/Java/util/List.html#remove%28int %29

0
fish
0
Nick Chalko