104

私はArrayList仮定を持っていてlist、それには 8 つのアイテム AH があり、int 配列に格納されている 1,3,5 の位置のアイテムを削除したいと思いlistます。これを行うにはどうすればよいですか。

私はこれをやろうとしています

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

しかし、配列の最初のアイテムが削除された後、配置が変更され、次の反復で間違った要素が削除されるか、例外が発生します。

4

11 に答える 11

141

この特定のケースでは、要素を降順で削除する必要があります。最初のインデックス5、次に3、次に1. これにより、望ましくない副作用なしにリストから要素が削除されます。

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
于 2012-05-23T05:58:12.717 に答える
30

ArrayListを使用して要素を削除できますListIterator

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position
于 2012-05-23T06:06:40.217 に答える
10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}
于 2013-01-24T11:58:02.240 に答える
7

前に述べたように

iterator.remove()

ループ中にリスト項目を削除する唯一の安全な方法かもしれません。

イテレータを使用したアイテムの削除についてより深く理解するには、このスレッドを参照してください。

于 2015-02-24T08:59:23.387 に答える
4

配列 i は昇順でソートされていると仮定します。これは Iterator を使用した別のソリューションです。より一般的です。

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}
于 2016-08-29T14:55:32.680 に答える
3
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}
于 2012-05-23T06:01:14.620 に答える
2

これはどう?ちょっと考えてみてください-

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

そして、出力は-

[A, C, E, G, H]
于 2012-05-23T06:03:48.923 に答える
2

arraylist の remove(int index) メソッドは、リスト内の指定された位置 (index) にある要素を削除します。配列リスト項目を削除した後、後続の要素をすべて左にシフトします。

配列リストに {20,15,30,40} が含まれているかどうかを意味します

メソッドを呼び出しました: arraylist.remove(1)

次に、データ 15 が削除され、30 & 40 これらの 2 つの項目が 1 だけ左にシフトされます。

このため、最初に arraylist の上位のインデックス項目を削除する必要があります。

だから..あなたの与えられた状況のために..コードは..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
于 2016-03-06T14:28:17.863 に答える
2

こうやってみて、

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}
于 2012-05-23T06:07:06.573 に答える
2

「=」を使用すると、元の arraylist のレプリカが 2 番目に作成されますが、参照は同じであるため、一方の list を変更すると、もう一方も変更されます。「=」の代わりにこれを使用します

        List_Of_Array1.addAll(List_Of_Array);
于 2013-11-19T05:32:30.857 に答える