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

7

I created a State class with name, acronym and capital and a Country with name, capital and states - an ArrayList of type State.

I want to create a method insertState (State e) that before adding the state into a Country, checks if it has not already been added before and displays a message. I thought of it this 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 no error is made, you are not adding the elements. Also, I would like to know what the signature of the method would be for me to be able to return these messages.

    
asked by anonymous 23.08.2015 / 21:47

3 answers

6

To verify that 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 should do with what type of method return is 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.";
    }
}
    
23.08.2015 / 22:00
8

You do not have to go through the entire list explicitly to check for an object, List already has a method for it: contains (Object o) .

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

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

In Pais , your adicionaEstado method 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 output:

Estado adicionado.
Esse estado já foi adicionado ao país anteriormente.
    
23.08.2015 / 22:02
3

The simplest way would be to use 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.");
    }
    
23.08.2015 / 21:57