Menu

Probleme map stream

- - Dernière réponse :  jesuisunpseudo - 10 janv. 2019 à 18:00
Bonjour,

Me revoila avec un petit soucis donc je ne trouve pas la solution.

J'ai donc une map avec des votes par date et je dois renvoyer en une stream avec les dates et le nombre de votes par date en fonction du type de vote en parametre. J'ai essayé plusieurs choses donc la dernière en date ci-dessous qui ne compile même pas mais je ne sais pas dutout vers ou aller.. si quelqu'un à une idée je suis prenant


	Map<LocalDateTime, Set<Vote>> votes = new TreeMap<>();




	public Map<LocalDateTime, Integer> nombreVotants(TypeVote typeVote) {
		return votes.values().stream().filter(v -> v.getTypeVote(typeVote))
				.collect(Collectors.groupingBy(Function.identity(), Integer.valueOf(Collectors.counting().toString()));


Merci



Configuration: Windows / Chrome 71.0.3578.98
Afficher la suite 

Votre réponse

1 réponse

Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3625
0
Merci
(Re)Bonjour,

Essayes de nous donner un maximum de détail sur ton problème quand tu postes, par exemple ici en nous donnant le code de tes classes Vote et TypeVote, pour toi ça ne coûte qu'un copier-coller mais sans ça nous il faudrait réécrire tout depuis le début pour obtenir quelque chose qui sera différent de toi...

De plus, un bon exemple ça fait toujours du bien pour comprendre ta question, parce que "une stream avec les dates et le nombre de votes par date en fonction du type de vote en parametre" c'est pas évident.

Pour traiter des Map avec les stream tu peux l'exploser en Set<Entry> via la méthode entrySet() puis la recomposer à la fin avec Collectors.toMap
-
Voici mon code au complet pour plus de clarté.

class DoodleImpl implements Doodle {

	private String nom;

	Map<LocalDateTime, Set<Vote>> votes = new TreeMap<>();

	public DoodleImpl() {

	}

	public DoodleImpl(String nom) {
		this.nom = nom;
	}

	@Override
	public void setNom(String nom) {
		this.nom = nom;
	}

	/*
	 * La méthode renvoie par date le nombre de votes obtenus pour le type de
	 * disponibilité reçu en paramètre. Cette méthode doit s'écrire avec une stream
	 * (1 seule instruction).
	 */
	@Override
	public Map<LocalDateTime, Integer> nombreVotants(TypeVote typeVote) {
		return votes.values().stream().filter(v -> v.getTypeVote(typeVote))
				.collect(Collectors.groupingBy(Function.identity(), Integer.valueOf(Collectors.counting().toString()));


	@Override
	public String toString() {
		String ret = "";
		Set<LocalDateTime> set = votes.keySet();
		for (LocalDateTime localDateTime : set) {
			ret += localDateTime.toString() + votes.get(localDateTime) + " \n";
		}
		return ret;
	}

	// class interne
	public class Vote {

		private String nomVotant;
		private TypeVote typeVote;

		public Vote(String nomVotant, TypeVote typeVote) {
			super();
			this.nomVotant = nomVotant;
			this.typeVote = typeVote;
		}

		public String getNomVotant() {
			return nomVotant;
		}

		public TypeVote getTypeVote() {
			return typeVote;
		}

		public void setNomVotant(String nomVotant) {
			this.nomVotant = nomVotant;
		}

		public void setTypeVote(TypeVote typeVote) {
			this.typeVote = typeVote;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + getOuterType().hashCode();
			result = prime * result + ((nomVotant == null) ? 0 : nomVotant.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Vote other = (Vote) obj;
			if (!getOuterType().equals(other.getOuterType()))
				return false;
			if (nomVotant == null) {
				if (other.nomVotant != null)
					return false;
			} else if (!nomVotant.equals(other.nomVotant))
				return false;
			return true;
		}

		@Override
		public String toString() {
			return nomVotant + " > " + typeVote.getDisponibilite();
		}

		private Doodle getOuterType() {
			return DoodleImpl.this;
		}
	}

	// enum interne
	public enum TypeVote {

		DISPO("Disponible"), PAS_DISPO("Indisponible"), PEUT_ETRE("Non défini");

		private String disponibilite;

		private TypeVote(String disponibilite) {
			this.disponibilite = disponibilite;
		}

		public String getDisponibilite() {
			return disponibilite;
		}

	}

}
KX
Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3625 > jesuisunpseudo -
Comme je le disais, tu peux décomposer la Map en un stream d'Entry que tu collectes ensuite en Map sachant que la seule chose qui change ce sont les valeurs pour lesquelles il faut faire un autre stream sur le Set<Vote>

public Map<LocalDateTime, Integer> nombreVotants(TypeVote typeVote) {
    return votes.entrySet().stream().collect(Collectors.toMap(Entry::getKey,
      e -> (int) e.getValue().stream().map(Vote::getTypeVote).filter(t -> t == typeVote).count()));
}
-
Merci je ne connaisais par le Map Entry
Commenter la réponse de KX