1
votes

En utilisant un Hashmap en Java, est-il possible d'imprimer le nombre de clés aura la même valeur?

Si j'ai un Hashmap avec exactement les mêmes valeurs mais des clés différentes, il est possible d'obtenir ces clés avec les mêmes valeurs et d'imprimer le nombre de clés qui partagent cette valeur et la valeur elle-même qui est partagée et de le faire de manière dynamique donc sans coder en dur les valeurs dans une instruction if? Exemple,

CODE

pending 2
cancelled 1
fulfilled 1

Sortie souhaitée

HashMap<String, String> map = new HashMap<>();

map.put("Order1"  " pending " );
map.put("Order2"  " cancelled " );
map.put("Order3"  " pending " );
map.put("Order4"  " fulfilled " );


0 commentaires

3 Réponses :


2
votes

Vous pouvez placer vos valeurs dans un Set pour obtenir des uniques, puis compter les occurrences de chaque élément avec Collections.frequency :

Set<String> singles = new HashSet<>(map.values());

for(String element : singles) {
    System.out.println(element + ": " + Collections.frequency(map.values(), element));
}

p>


0 commentaires

2
votes

Non, HashMap ne fournit pas cette fonctionnalité prête à l'emploi.

Cependant, vous pouvez utiliser deux approches différentes pour atteindre l'objectif:

A) Si le nombre de commandes dans chaque état n'a pas besoin d'être vérifié aussi souvent, parcourez simplement map.values ​​() et comptez le nombre de commandes dans chaque état

B) Si le nombre de commandes est très grand, ou si l'état doit être vérifié souvent, chaque fois que vous ajoutez une nouvelle commande ou mettez à jour son état, incrémentez un compteur pour le nouvel état et décrémentez le compteur pour l'ancien état.


0 commentaires

1
votes

Une autre option consiste à mapper chaque valeur sur un nombre. Voici une façon de le faire en utilisant des flux:

public static <K, V> Map<V, List<K>> foo(Map<K, V> map) {
    return map.entrySet().stream().collect(Collectors.groupingBy(
            Map.Entry::getValue,
            Collectors.mapping(Map.Entry::getKey, Collectors.toList())
    ));
}

Vous pouvez ensuite imprimer les résultats comme suit:

Map<String, String> map = ...;
foo(map).forEach((k, v) -> System.out.printf("%s %d%n", k, v));

Vous pouvez modifiez-le également pour savoir quelles clés ont été mappées à la même valeur.

public static <K, V> Map<V, Long> foo(Map<K, V> map) {
    return map.entrySet().stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.counting()));
}


0 commentaires