Remover Item de ArrayList

100

Eu tenho um ArrayListsuposto liste tem 8 itens AH e agora eu quero excluir 1,3,5 item de posição armazenado na matriz int de listcomo posso fazer isso.

Estou tentando fazer isso com

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]);
}

Mas após o primeiro item excluído, a posição do array é alterada e na próxima iteração ele exclui o elemento errado ou dá exceção.

Krishnakant Dalal
fonte
Que tal removê-lo na ordem decrescente dos índices (classificar os índices e, em seguida, remover o elemento com o índice mais alto primeiro)?
nhahtdh
1
Sua lógica é falha. Certamente você não deveria estar pensando sobre a posição de cada item, mas sim sobre os próprios itens. Em outras palavras, você não deseja remover as posições 1, 3 e 5, mas, em vez disso, deseja remover os itens (onde quer que estejam List) usando equals("B"), equals("D")e equals("F"). Pense nisso.
Squonk
Sim, eu quero excluir o item, mas como posso combinar os itens. Na verdade, os itens reais estão em ListView e, ao selecionar, desejo excluí-los do DB e do Array e atualizar o adaptador e a List
Krishnakant Dalal
Opção lenta: itera uma vez adicionando os elementos a uma segunda lista, itera a segunda lista removendo da primeira (etapa opcional: retornar a segunda lista para o
autor

Respostas:

133

Neste caso específico , você deve remover os elementos em ordem decrescente. Primeiro índice 5, em seguida 3, em seguida 1. Isso removerá os elementos da lista sem efeitos colaterais indesejáveis.

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
Alex Lockwood
fonte
1
O ArrayList do OP contém Strings, não Integers (no entanto, concordo com sua observação).
Alex Lockwood
@Alex: Essa resposta funcionará, mas é tão falha quanto a lógica do OP em sua pergunta. Estamos falando sobre ArrayList<E>- por que alguém iria querer remover um objeto de uma ArrayListposição baseada puramente em, em vez de testar o que está nessa posição? O OP pode muito bem estar sendo usado Stringcomo tipo de objeto para o, ArrayListmas sua resposta é uma prática de codificação realmente ruim para genéricos, mesmo que resolva a situação particular do OP.
Squonk
3
Sim, eu concordo com você. Mas o OP perguntou ArrayList<String>, não ArrayList<E>.
Adrian Monk
Eu discordo totalmente desta resposta, @MisterSquonk você está convencido, a solução deve ser genérica. Além disso, por que estou recebendo downvote?
Mohammed Azharuddin Shaikh
66
OK, ouça ... Eu não sei qual é o problema. O OP postou seu código e eu respondi com uma resposta que ilustrou uma possível correção. Desculpe, não fui além ao dar uma solução completamente geral ... mas até onde eu posso dizer, o OP não estava pedindo uma aula de programação. Ele estava perguntando "por que este código não está funcionando?" Não comece a me culpar por votar contra sua resposta só porque você interpretou a pergunta de maneira diferente.
Alex Lockwood
30

Você pode remover elementos ArrayListusando 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
Jainendra
fonte
É melhor e uma boa prática usar o método ListIterator remove () para remover objetos da Coleção em Java, porque pode haver chance de que outro encadeamento esteja modificando a mesma coleção e pode levar a ConcurrentModificationException.
Min2 de
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);

    }
}

fonte
7

Como mencionado anteriormente

iterator.remove()

é talvez a única maneira segura de remover itens da lista durante o loop.

Para um entendimento mais profundo da remoção de itens usando o iterador, tente olhar este tópico

shimon001
fonte
Estou atordoado sem votos, concordo totalmente com você. Esta é a maneira mais segura de fazer isso.
Simmant
3

Presumo que a matriz i seja ascendente classificada, aqui está outra solução com Iterator, é mais genérico:

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++;
}
DàChún
fonte
2

Que tal agora? Basta pensar nisso -

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);

        }


}

E a saída foi-

[A, C, E, G, H]
sgowd
fonte
2

Tente desta forma,

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]);
}
Khan
fonte
2
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}
Mohammed Azharuddin Shaikh
fonte
2

Se você usar "=", uma réplica é criada para a lista de arraylist original na segunda, mas a referência é a mesma, então se você alterar em uma lista, a outra também será modificada. Use isto em vez de "="

        List_Of_Array1.addAll(List_Of_Array);
Rahul Gupta
fonte
2

O método remove (int index) de arraylist remove o elemento na posição especificada (índice) na lista. Após remover os itens da lista de matrizes, os elementos subsequentes são movidos para a esquerda.

Significa se um array contém {20,15,30,40}

Eu chamei o método: arraylist.remove (1)

então, os dados 15 serão excluídos e 30 e 40 esses dois itens serão deslocados à esquerda em 1.

Por esta razão, você deve primeiro excluir o item de índice superior da lista de arraylist.

Então ... para a sua situação ... o código será ..

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]);
}
Avijit Karmakar
fonte