Check if the element exists in Arraylist and, if not, add it

Asked

Viewed 31,605 times

8

I created a state class with name, acronym and capital and a country with name, capital and states - an Arraylist of the type State.

I want to create an input methodState(and status) that before adding the state in a Country, checks if it has not already been added before and displays a message. I thought that way:

public void adicionaEstado(Estado e){

    for(int i=0; i < estados.size(); i++){
        if (estados.get(i).getNome().equals(e.getNome())){
           System.out.println("Esse estado já foi adicionado ao país anteriormente.");
        }
        else{
            estados.add(e);
            System.out.println("Estado adicionado.");
        }
    }
}

Although it is not a mistake, it is not adding the elements. Also, I would like to know how the signature of the method would have to be for me to be able to return these messages.

  • 3

    if(estados.contains(e)){...}

3 answers

9

You do not need to explicitly scroll through the entire list to verify the presence of an object, List already has a method for this: contains(Object o).

So, to use it, just implement your equity rule in Estado, overwriting equals, something like that:

@Override
public boolean equals(Object obj) {
    if (!(obj instanceof Estado)) {
        return false;
    }
    final Estado other = (Estado) obj;
    return this.getNome().equals(other.getNome());
}

In the entity Pais, your method adicionaEstado would look like this:

public void adicionaEstado(Estado e) {
    if (estados.contains(e)) {
        System.out.println("Esse estado já foi adicionado ao país anteriormente.");
    } else {
        estados.add(e);
        System.out.println("Estado adicionado.");
    }
}

A complete example would be this:

Entity Estado:

public class Estado {

    private String nome;

    // getter e setter

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Estado)) {
            return false;
        }
        final Estado other = (Estado) obj;
        return this.getNome().equals(other.getNome());
    }

}

Entity Pais:

public class Pais {

    private List<Estado> estados = new ArrayList<>();

    public void adicionaEstado(Estado e) {
        if (estados.contains(e)) {
            System.out.println("Esse estado já foi adicionado ao país anteriormente.");
        } else {
            estados.add(e);
            System.out.println("Estado adicionado.");
        }
    }

}

A simple program:

public class Main {

    public static void main(String[] args) {
        final Pais pais = new Pais();
        final Estado sc = new Estado();
        sc.setNome("Santa Catarina");

        pais.adicionaEstado(sc);
        pais.adicionaEstado(sc);
    }

}

That will generate this exit:

Estado adicionado.
Esse estado já foi adicionado ao país anteriormente.

7


For you to check if the item already exists in ArrayList, you can do the following:

estados.Contains(e);

For your method to return the messages you are using, you must do with what kind of return of the method string and not void as you are currently doing.

Basically the method would look like this

public String adicionaEstado(Estado e){
    if(!estados.Contains(e)){
        estados.add(e);
        return "Estado adicionado.";
    }else{
        return "Esse estado já foi adicionado ao país anteriormente.";
    }
}

3

The simplest way would be using Contains():

    if (estados.contains(e))
    {
       System.out.println("Esse estado já foi adicionado ao país anteriormente.");
    }
    else
    {
        estados.add(e);
        System.out.println("Estado adicionado.");
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.