Façon la plus simple de parcourir un Multiset dans l'ordre de fréquence des éléments?
Considérer cet exemple qui imprime certains type de périphérique stats. ("DeviceType" est un enum avec un dozenish valeurs).
Multiset<DeviceType> histogram = getDeviceStats();
for (DeviceType type : histogram.elementSet()) {
System.out.println(type + ": " + histogram.count(type));
}
Quelle est la plus simple et la plus élégante façon d'imprimer les différents éléments du dans l'ordre de leur fréquence (type le plus commun de la première)?
Avec un rapide coup d'oeil à la Multiset
de l'interface, il n'y a aucune méthode pour cela, et aucun de Goyave est Multiset
implémentations (HashMultiset
, TreeMultiset
, etc) semblent conserver automatiquement les éléments de la fréquence commandés.
Vous devez vous connecter pour publier un commentaire.
Je viens d'ajouter cette fonctionnalité à la Goyave, voir ici pour la Javadoc.
Modifier: exemple d'utilisation de
Multisets.copyHighestCountFirst()
que par la question de départ:copyHighestCountFirst()
fonctionne très bien.Voici une méthode qui retourne un
List
d'entrées, triés par fréquence (mise à JOUR: utilisé un drapeau pour basculer dans l'ordre croissant /décroissant et utilisé Goyave jouet favori: leEnum Singleton Pattern
, que l'on trouve dans Efficace Java, Point 3 ):Code de Test:
De sortie:
Ints
classe avant. En regardant l'API docs un peu plus,Files
était aussi nouveau pour moi — un util de collecte similaire à ce que Commons IO a, sauf avec la prise en charge des génériques & en quelque sorte nettoyeur dans l'ensemble.)Une mise en Œuvre à l'aide de ForwardingMultiSet :
(EntryComp de seanizer de l' réponse)
Depuis il n'est pas encore mis en œuvre, je suppose que vous pouvez créer un
Map
avec la clé=valeur et de type=count. Puis sorte que la carte - voir ici