私はJavaプログラミングに不慣れで、phpでプログラミングしているので、このタイプのループに慣れています。
int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
mapOverlays.remove(n);
}
それで、最初のアイテム以外のすべてを削除したいのに、なぜこれが機能しないのですか?取得すると、削除後、配列キーが再配置されますか?
取得すると、削除後、配列キーが再配置されますか?はい、位置1のアイテムを削除した後、位置2にあったアイテムは位置1にあります。
あなたはこれを試すことができます:
Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item
あなたが使うことができます
mapOverlays.subList(1, mapOverlays.size()).clear();
逆にやってみませんか?
int size = itemizedOverlay.size();
for(int n=size-1;n>0;n--)
{
mapOverlays.remove(n);
}
最初の要素だけを含む新しいArrayListを作成する方が速いと思います。何かのようなもの :
E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);
ArrayList
には、0からsize() - 1
までの整数インデックスがあります。あなたができること:
_int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
mapOverlays.remove(1);
}
_
これはおそらくPHPに期待するものと一致します。変化する1番目の要素を継続的に削除することで機能します。ただし、内部アレイを常にシフトダウンする必要があるため、パフォーマンスは低下します。 clear()
を使用するか、逆の順序で実行することをお勧めします。
残念です removeRange
保護されているのは、このタイプの操作に便利だからです。
シンプル。
mapOverlays = Collections.singletonList(mapOverlays.get(0));
mapOverlays
がArrayList
参照を保持していると仮定しています。
mapOverlays
がList
または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では重要です。)
ただし、mapOverlays
がCollection
として宣言されている場合、remove(n)
はremove(<E>)
オーバーロードにバインドされ、引数に一致するオブジェクトが削除されます。宣言された型に応じて、これによりコンパイルエラーが発生するか、int
がInteger
として自動ボックス化され、(おそらく)何も削除されません。 GOTCHA!
int size = mapOverlays.size();
for(int n=0;n<size;n++)
{
mapOverlays.remove(n);
}
Javaでは、mapOverlaysがリストの場合、最初のインデックスとして0から始まります。したがって、forループではn = 0です。
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
ソリューションを使用する必要があります。読むのは少し難しいですが、リストインスタンスを再作成できない場合(他の場所で参照されている場合)、おそらく最速の解決策です。
配列の代わりに_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
GoogleコレクションとLists.limitを使用する http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#limit(Java.lang.Iterable =、int)