cami-la / collections-java-api-2023

Este repositório é referente ao curso "Collection Framework API Java" e é uma valiosa contribuição para a comunidade de desenvolvedores Java, fornecendo exemplos práticos e recursos educacionais relacionados à poderosa API de coleções da linguagem Java.
https://web.dio.me/course/conhecendo-collections-java/learning/c5d6f4e1-6d05-4eea-93d8-d292c708999f
876 stars 636 forks source link

Exercício Conjunto Convidados #22

Closed HayaneWakayama closed 10 months ago

HayaneWakayama commented 10 months ago

Olá Cami, não sei o que estou fazendo errado, talvez seja algo simples que não vi. Mas no momento da remoção, todos os convidados com mesmo código estão sendo removidos. Pensei que fosse algo com break.

package set.OperacoesBasicas;

import java.util.HashSet;
import java.util.Set;

public class ConjuntoConvidados {
    //Atributos
    private Set<Convidado> convidadosSet;

    public ConjuntoConvidados() {
        this.convidadosSet = new HashSet<>();
    }

    public void adicionarConvidado(String nome, int codigoConvite) {
        convidadosSet.add(new Convidado(nome, codigoConvite));
    }

    public void removerConvidadoPorCodigoConvite(int codigoConvite) {
        Convidado convidadoParaRemover = null;
        if(!convidadosSet.isEmpty()) {
            for (Convidado c : convidadosSet) {
                if (c.getCodigoConvite() == codigoConvite) {
                    convidadoParaRemover = c;
                    break;
                }

            }
            convidadosSet.remove(convidadoParaRemover);
        } else {
            throw new RuntimeException("O conjunto esta vazio");
        }
    }

    public int contarConvidados() {
        return convidadosSet.size();
    }

    public void exibirConvidados() {
        if(!convidadosSet.isEmpty()) {
            System.out.println(convidadosSet);
        } else {
            System.out.println("O conjunto está vazio");
        }
    }

    public static void main(String[] args) {
        //Criando uma instancia da classe ConjuntoConvidados
        ConjuntoConvidados conjuntoConvidados = new ConjuntoConvidados();

        //Exibindo o numero de convidados no conjunto (deve ser zero)
        System.out.println("Existem " + conjuntoConvidados.contarConvidados());

        //adicionando convidados
        conjuntoConvidados.adicionarConvidado("Hayane", 1234);
        conjuntoConvidados.adicionarConvidado("Rafael", 1235);
        conjuntoConvidados.adicionarConvidado("Sabrina", 1236);
        conjuntoConvidados.adicionarConvidado("Carol", 1237);
        conjuntoConvidados.adicionarConvidado("Bia", 1236);
        conjuntoConvidados.adicionarConvidado("Ana", 1237);

        System.out.println("Convidados no conjunto:");
        conjuntoConvidados.exibirConvidados();

        System.out.println("Existem " + conjuntoConvidados.contarConvidados() + " convidado(s) dentro do Set de Convidados");

        conjuntoConvidados.removerConvidadoPorCodigoConvite(1236);

        System.out.println("Convidados no conjunto após a remoção:");
        conjuntoConvidados.exibirConvidados();
    }

}
cami-la commented 10 months ago

Oi, @HayaneWakayama. Tudo bem? (:

Então, acredito que o "erro" esteja na classe Convidado. Tipo, você definiu qual atributo da classe Convidado através dos métodos equals and hascode irá definir quando o elemento é único?

public class Convidado {
  //atributos
  private String nome;
  private int codigoConvite;

  public Convidado(String nome, int codigoConvite) {
    this.nome = nome;
    this.codigoConvite = codigoConvite;
  }

  public String getNome() {
    return nome;
  }

  public int getCodigoConvite() {
    return codigoConvite;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Convidado convidado)) return false;
    return getCodigoConvite() == convidado.getCodigoConvite();
  }

  @Override
  public int hashCode() {
    return Objects.hash(getCodigoConvite());
  }

  @Override
  public String toString() {
    return "Convidado{" +
        "nome='" + nome + '\'' +
        ", codigoConvite=" + codigoConvite +
        '}';
  }
}

Na classe acima, estou definindo que o código do convite ele é único. Então se eu tentar adicionar 2 convidados com o mesmo código de convite, não vai funcionar. Não vai dar erro e não modifica o Set.

O certo não seria cada convidado ter um código único? Ou você está definindo outro atributo para ser único?

HayaneWakayama commented 10 months ago

Oii, consegui resolver!! Obrigada 👍