Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplest way to iterate through a Multiset in the order of element frequency?

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.

like image 701
Jonik Avatar asked Dec 03 '10 12:12

Jonik


People also ask

Is multiset ordered?

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].

Is multiset sorted in C++?

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.

How do I access multiset element?

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)


1 Answers

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)); } 
like image 65
Louis Wasserman Avatar answered Oct 01 '22 10:10

Louis Wasserman