Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

LIST X SET

Utilizei um Set ao invés de List na classe banco imaginando que se eu inserisse duas empresas com o mesmo nome ao rodar /listEmpresas apareceria apenas um nome, o que não ocorreu. O que está errado ?

package br.com.alura.gerenciador.servlet;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Banco {
    private static Set<Empresa> lista = new HashSet();

    public Set<Empresa> adiciona(Empresa empresa){
        Banco.lista.add(empresa);
        return Banco.lista;

    }

    public Set<Empresa> getEmpresas() {
        return Banco.lista;
    }



}
package br.com.alura.gerenciador.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ListaEmpresasServlet
 */
@WebServlet("/listaEmpresas")
public class ListaEmpresasServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Banco banco = new Banco();
        Set<Empresa> lista =  banco.getEmpresas();
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<ul>");
        lista.forEach(empresa -> out.println("<li>" + empresa.getNome() + "</li>"));
        out.println("</ul>");
        out.println("</body></html>");
        System.out.println(lista.size());


    }

}
3 respostas

O seu set não é de string, e sim de objetos da classe Empresa. Duas empresas só serão iguais se forem a mesma instância. Para que duas empresas de instâncias diferentes sejam consideradas a mesma seria necessário reimplementar os métodos equals e hashCode na classe Empresa.

Mas foi o que eu fiz

package br.com.alura.gerenciador.servlet;

public class Empresa {
    private Integer id;
    private String nome;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public boolean equals(Object obj) {
        Empresa outra = (Empresa) obj;
        this.getNome().equals(outra.getNome());
        return super.equals(obj);

    }

    @Override
    public int hashCode() {

        return this.getNome().hashCode();
    }

}
solução!

O equals está errado. Apague a linha return super.equals(obj) e altere a linha anterior incluindo return


 @Override
    public boolean equals(Object obj) {
        Empresa outra = (Empresa) obj;
        return this.getNome().equals(outra.getNome());

    }