4
respostas

Como remover elementos de um arraylist com mais de um objeto de tipo diferente

No código abaixo, é criada primeiramente uma classe "User" com os atributos name (String) e age (int). Na classe principal, é criado um ArrayList e adicionados valores a essa lista, com base nos atributos citados. Pergunta: como eu faria, por exemplo, para procurar na lista se há um valor "age" = 25 e, se localizado, remover esse valor e também a String associada (no caso "Rajeev").

import java.util.ArrayList;
import java.util.List;

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class ArrayListUserDefinedObjectExample {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User("Rajeev", 25));
        users.add(new User("John", 34));
        users.add(new User("Steve", 29));
4 respostas

Olá Willian, tudo bem com você?

Poderia explicar melhor o seu exemplo, no seu caso não há objetos de tipos diferentes, são todos do tipo usuário, e também ficou estranho essa parte de "remover esse valor", dado que estamos trabalhando com atributos de objetos o máximo que poderíamos fazer é colocar nullpara Stringe 0 para int

O que me parece viável no seu exemplo é: "Se achar alguém com idade igual a 25, remover da lista"

Ai poderíamos utilizar o removeIf:

System.out.println(users.size());
>> 3

users.removeIf( user -> user.getAge() == 25);

System.out.println(users.size());
>> 2

Foi isso que você quis dizer?

Abraços!

Bom dia Geovani, mais ou menos isso. Veja, há um método no arraylist chamado indexOf. Ele percorre o array e, quando encontra a primeira ocorrência de um elemento ele retorna a posição no array, correto? Como, de forma similar ao indexOf, eu percorro este array em busca do primeiro "John" e consigo retornar a posição que está tanto o John quanto o 34 (age) para que eu possa remover ambos... ou como remover condicionalmente neste caso?

Então Willian, mas neste exemplo que você está dando o John e o 34estão na mesma posição pois estão encapsulados dentro do objeto Usuário, então está confuso para mim esse remover ambos

Agora se você quer passar um nome e trazer um ìndextem 2 formas, a mais fácil seria sobrescrever o equalsque será utilizado pelo método do arraylist,a outra realmente seria fazer uma implementação própria do for, mas sinceramente, eu não vejo isso tendo muita utilização, pra mim o filter faria muito sentido, devolvendo o elemento e não o índice

Mas ainda esta confuso essa parte de remover ambos, sendo que é um elemento só 🤔 🤔 🤔

Abraços :)

Geovani, boa tarde! Digamos que, no meu exemplo, eu adicione o seguinte:

users.add(new User("Rajeev", 25)); //"Rajeev" primeira vez
users.add(new User("John", 34));
users.add(new User("Rajeev", 26)); //"Rajeev" segunda vez
users.add(new User("Steve", 29));

Como você pode perceber, eu incluí duas vezes o "Rajeev" no arraylist mas os inteiros são 25 no primeiro e 26 no segundo. Mas eu quero excluir apenas a primeira ocorrência de "Rajeev" com seu respectivo inteiro, ou seja, apenas o "Rajeev" e o 25! Se eu uso o removeIf, funciona, mas remove todas as ocorrências de "Rajeev". Agora acho que consegui explicar minha dúvida com um exemplo prático. Obrigado!