How to recover an object from a Hashset

Asked

Viewed 496 times

1

I store my vows within a HashSet, but I would like to do a vote count in a Result class. How do I retrieve these votes and group by quantity?


import java.util.Collection;
import java.util.HashSet;

public class Votacao {

    private Long id;

    private final static Collection<Voto> VOTOS = new HashSet<>();

    public Votacao(Voto voto) {
        if(VOTOS.contains(voto)){
            System.err.println("Membro já votou!");
        }else{
            computaVoto(voto);
        }
    }

    public static Collection<Voto> getVotos() {
        return VOTOS;
    }

    private void computaVoto(Voto voto){
       VOTOS.add(voto);
    }

    @Override
    public String toString() {
        return VOTOS.toString();
    }

    public Long getId() {
        return id;
    }

    public static Collection<Voto> getVOTOS() {
        return VOTOS;
    }
}

import javax.persistence.*;
import java.util.Objects;

@Entity(name = "votos")
public class Voto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    private Membro votante;

    @OneToOne
    private Encaminhamento voto;

    public Voto(Membro membro, Encaminhamento encaminhamento) {
        this.setVotante(membro);
        this.setVoto(encaminhamento);
    }

    public Long getId() {
        return id;
    }

    public Membro getVotante() {
        return votante;
    }

    private void setVotante(Membro membro) {
        if(membro == null || membro.getNome() == null) {
            throw new IllegalArgumentException();
        } else {
            this.votante = membro;
        }
    }

    public Encaminhamento getVoto() {
        return voto;
    }

    private void setVoto(Encaminhamento voto) {
        if(voto == null){
            throw new IllegalArgumentException();
        } else {
            this.voto = voto;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Voto voto = (Voto) o;
        return Objects.equals(id, voto.id) &&
                Objects.equals(votante, voto.votante);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, votante, voto);
    }

    @Override
    public String toString() {
        return  getVotante().getId()+" "+ getVotante().getNome() + " " + getVoto().getId() + " " + getVoto().getDescricao();
    }
}

1 answer

3


A good solution is you map the votes of Set in a HashMap, grouping by some attribute of your class Voto, in the case, the attribute voto. See the example I created below:

I created a class Vote:

class Voto {
    String voto;

    public Voto(String voto) {
        this.voto = voto;
    }

    public Voto() {
    }
}

Then I took some vows and put them in a Set:

Voto a = new Voto("Neymar");
Voto b = new Voto("Ronaldinho");
Voto c = new Voto("Ronaldinho");
Voto d = new Voto("Rivaldo");

HashSet<Voto> votos = new HashSet<>();
Collections.addAll(votos, a, b, c, d);

The magic occurs now. I feed a HashMap collecting the votes of Set and using as key a property class Voto, in the case, voto, because that is the attribute that interests us. In the end, we will have a HashMap where each key will value a list filled with votes for each player:

Map<String, List<Voto>> votosAgrupados = votos.stream().collect(Collectors.groupingBy(w -> w.voto));

To find out the amount of votes is now easy. Just go through the HashMap checking the size of each list and displaying the result:

votosAgrupados.forEach((k,v)->System.out.println("Voto : " + k + " - Quantidade : " + v.size()));

That will print:

//Voto : Ronaldinho - Quantidade : 2
//Voto : Rivaldo - Quantidade : 1
//Voto : Neymar - Quantidade : 1

If that answer helped you, mark it as correct so others can use it as well.

Browser other questions tagged

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