Consider this example which prints out some device type stats. ("DeviceType" is an enum with a dozenish values.)
Multiset<DeviceType> histogram = getDeviceStats(); for (DeviceType type : histogram.elementSet()) { System.out.println(type + ": " + histogram.count(type)); }
What's the simplest, most elegant way to print the distinct elements in the order of their frequency (most common type first)?
With a quick look at the Multiset
interface, there's no ready-made method for this, and none of Guava's Multiset
implementations (HashMultiset
, TreeMultiset
, etc) seem to automatically keep elements frequency-ordered either.
As with sets, and in contrast to tuples, order does not matter in discriminating multisets, so {a, a, b} and {a, b, a} denote the same multiset. To distinguish between sets and multisets, a notation that incorporates square brackets is sometimes used: the multiset {a, a, b} can be denoted by [a, a, b].
In case of Set, data is stored in sorted order. In case of MultiSet also the data is stored in sorted order. In Set duplicate values are not allowed to get stored.
Some Basic Functions associated with multiset:size() – Returns the number of elements in the multiset –> O(1) max_size() – Returns the maximum number of elements that the multiset can hold –> O(1) empty() – Returns whether the multiset is empty –> O(1) insert (x) – Inserts the element x in the multiset –> O(log n)
I just added this feature to Guava, see here for the Javadoc.
Edit: usage example of Multisets.copyHighestCountFirst()
as per the original question:
Multiset<DeviceType> histogram = getDeviceStats(); for (DeviceType type : Multisets.copyHighestCountFirst(histogram).elementSet()) { System.out.println(type + ": " + histogram.count(type)); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With