Java Arraylist Equals - Do not allow element duplicity in Arraylist

Asked

Viewed 99 times

0

Good evening, everyone!

I’m having second thoughts about comparing the duplicate elements in ArrayList created, in the case of my code I would like that if it has already been realized the loan to a person (in case Alex) it is not possible to make a new loan for Alex, but it is always allowing to realize more than one loan for the same person, can help me please?

I am using the equals, but if you have some other way to solve without problems.

From now on, thank you!

Like my code was originally

public static void main(String[] args) {

    ArrayList<Emprestimo> arrayemp1 = new ArrayList();

    System.out.println("\n== EMPRESTIMO ==");
    arrayemp1.add(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));
    arrayemp1.add(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));

    Emprestimo emprestimo = new Emprestimo();

    emprestimo.addEmprestimo(arrayemp1.get(0));
    emprestimo.addEmprestimo(arrayemp1.get(1));
}
public class Emprestimo {


     private ArrayList<Emprestimo> emprestimo = new ArrayList();

     public void addEmprestimo(Emprestimo emp1){ 

        if(emprestimo.equals(emp1)){
             System.out.println("Não é possível realizar mais que um empréstimo.");
        }else{
            emprestimo.add(emp1);
            System.out.println("Emprestimo realizado com sucesso.");
        }

    }

        public void imprimirEmprestimo(){
        for (int i=0; i<emprestimo.size(); i++){
            System.out.println(emprestimo.get(i));
        }
    }
}

Like my code is now

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

    ListaEmprestimo lista = new ListaEmprestimo();

    System.out.println("\n== EMPRESTIMO ==");

    lista.addEmprestimo(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));
    lista.addEmprestimo(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));

    lista.imprimirEmprestimos();
    }
}
public final class Emprestimo {
    private final Amigo amigo = new Amigo();
    private final Colecao colecao = new Colecao();   

    private final String nome;
    private final String dataEmprestimo, dataDevolucao;
    private final String nomeAmigo;
    private final String nomeLocal;

    public Emprestimo(String nome, String dataEmprestimo, String dataDevolucao, String nomeAmigo, String nomeLocal) {
        this.nome = nome;
        this.dataEmprestimo = dataEmprestimo;
        this.dataDevolucao = dataDevolucao;
        this.nomeAmigo = nomeAmigo;
        this.nomeLocal = nomeLocal;
    }

   @Override
    public String toString() {
        return "Emprestimo{" + "Amigo=" + amigo.nomeAmigo + ", "+ colecao + ", dataEmprestimo=" + dataEmprestimo + ", dataDevolucao=" + dataDevolucao +'}';
    }

    @Override
    public int hashCode() {
        return Objects.hash(nome,dataEmprestimo,dataDevolucao,nomeAmigo,amigo);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Emprestimo)) return false;
        Emprestimo outro = (Emprestimo) obj;
        return Objects.equals(nome, outro.nome)
                && Objects.equals(dataEmprestimo, outro.dataEmprestimo)
                && Objects.equals(dataDevolucao, outro.dataDevolucao)
                && Objects.equals(nomeAmigo, outro.nomeAmigo)
                && Objects.equals(amigo, outro.amigo);
    }
}
public class ListaEmprestimo {

private Collection<Emprestimo> emprestimos = new LinkedHashSet<>();

public ListaEmprestimo(){
}

public void addEmprestimo(Emprestimo emp1){
        if (emprestimos.add(emp1)) {
             System.out.println("Não é possível realizar mais que um empréstimo.");
        } else {
             System.out.println("Empréstimo realizado com sucesso.");
        }
    }

    public void imprimirEmprestimos() {
        for (Emprestimo e : emprestimos) {
            System.out.println(e);
        }
    }
}
public class Amigo{
    public String nomeAmigo,telefone,localAmigo;

    public Amigo(){
    }

    public Amigo(String nomeAmigo, String telefone, String localAmigo) {
        this.nomeAmigo = nomeAmigo;
        this.telefone = telefone;
        this.localAmigo = localAmigo;
    }

    private ArrayList<Amigo> amigo = new ArrayList();

    public void addAmigo(Amigo amigo1){  
           amigo.add(amigo1);
    }

    public void imprimirAmigo(){
        for (int i=0; i<amigo.size(); i++){
            System.out.println(amigo.get(i));
        }
    }

    public void validarEmprestimo(){
      //  if(amigo.get(1) ){
            System.out.println("Não é possível realizar mais que um empréstimo");
        //}
    }

    @Override
    public String toString() {
        return "Amigo{" + "nomeAmigo=" + nomeAmigo + ", telefone=" + telefone + ", localAmigo=" + localAmigo + '}';
    }

    public String getNome() {
        return nomeAmigo;
    }

    public String getTelefone() {
        return telefone;
    }

    public String getLocalAmigo() {
        return localAmigo;
    }  
}
public class Colecao{
    public String nome;

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return "Colecao{" + "nome=" + nome + '}';
    }
}
  • What’s in the classes Amigo and Colecao?

  • I just updated the post. Thanks for the feedback Victor.

1 answer

3


First, we see this:

public class Emprestimo {
     private ArrayList<Emprestimo> emprestimo = new ArrayList();

     // ... Mais código aqui ...
}

This makes no sense. It means that a Emprestimo has a list of Emprestimos. What happens is that your list is arrayemp1 and its addEmprestimo should be operating on that list.

if(emprestimo.equals(emp1))

That’s never gonna work, because emp1 is the type Emprestimo and emprestimo is the type ArrayList<Emprestimo>. Objects of different types will never be equal in any sound method implementation equals.

I suggest you put the list in a class just for her, out of Emprestimo. Use LinkedHashSet, for Sets do not allow duplicates. And take advantage that the method add returns a boolean saying whether it worked or not (if it doesn’t work out it’s duplicate):

import java.util.Collection;
import java.util.LinkedHashMap;

public class ListaEmprestimos {

    private Collection<Emprestimo> emprestimos = new LinkedHashSet<>();

    public ListaEmprestimos() {
    }

    public void addEmprestimo(Emprestimo emp1) {
        if (emprestimos.add(emp1)) {
             System.out.println("Não é possível realizar mais que um empréstimo.");
        } else {
             System.out.println("Empréstimo realizado com sucesso.");
        }
    }

    public void imprimirEmprestimos() {
        for (Elemento e : emprestimos) {
            System.out.println(e);
        }
    }
}

Having this, your main gets like this:

public class ControlaRevista {
    public static void main(String[] args) {
        ListaEmprestimos lista = new ListaEmprestimos();

        System.out.println("\n== EMPRESTIMO ==");
        lista.addEmpretimo(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));
        lista.addEmpretimo(new Emprestimo("SUPER HOMEM", "2/2/2020", "2/2/2020", "Alex", "Gaspar"));

        lista.imprimirEmprestimos();
    }
}

Finally, it is important to implement the methods equals and hashCode correctly in their class Emprestimo:

import java.util.Objects;

public final class Emprestimo {
    private final String nome;
    private final String dataEmprestimo;
    private final String dataDevolucao;
    private final String nomeAmigo;
    private final String nomeLocal;

    public Emprestimo(String nome, String dataEmprestimo, String dataDevolucao, String nomeAmigo, String nomeLocal) {
        this.nome = nome;
        this.dataEmprestimo = dataEmprestimo;
        this.dataDevolucao = dataDevolucao;
        this.nomeAmigo = nomeAmigo;
        this.nomeLocal = nomeLocal;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Emprestimo)) return false;
        Emprestimo outro = (Emprestimo) obj;
        return Objects.equals(nome, outro.nome)
                && Objects.equals(dataEmprestimo, outro.dataEmprestimo)
                && Objects.equals(dataDevolucao, outro.dataDevolucao)
                && Objects.equals(nomeAmigo, outro.nomeAmigo)
                && Objects.equals(nomeLocal, outro.nomeLocal);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nome, dataEmprestimo, dataDevolucao, nomeAmigo, nomeLocal);
    }
}
  • @Alexj If this answer solved your problem and you have no further questions, click the " " on the left of the answer to mark it as accepted/correct, which also marks your question as solved/answered. Otherwise, feel free to comment.

  • Hi Victor, thanks for the feedback. I performed the adjustment, however, on the result after compiling still displays twice the message "It is not possible to perform more than ----- > a loan." Since you’re only repeating once on addEmprestimo, I don’t know where I’m going wrong. I updated the post with the classes as they are in my code. Thanks for your help.

Browser other questions tagged

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