How to retrieve an object from a HashSet

1

I store my votes within a HashSet , however I'd like to do a vote count on a Class Result. 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();
    }
}
    
asked by anonymous 26.05.2018 / 17:37

1 answer

3

A good solution is to map the votes of Set to HashMap , grouping by some attribute of its Voto class, in this case, the voto attribute. Here's the example I created below:

I created a Voting class:

class Voto {
    String voto;

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

    public Voto() {
    }
}

Then I created some votes and put them in 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 takes place now. Food HashMap collecting the votes of Set and using as key a class property Voto , in this case, voto , because it is this attribute that interests us. In the end, we will have a HashMap where each key will have a list filled with votes for each player:

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

Finding the number of votes is now easy. Just scroll through HashMap by checking the size of each list and display the result:

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

What's going to print:

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

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

    
26.05.2018 / 19:39