从最常见的X条目的Multiset中获取有序子集

时间:2014-01-21 02:23:09

标签: java guava priority-queue multiset

我有

Multiset<String> keys

我希望有一个拥有200个最常用键的Multiset。我已经弄清楚如何获得按频率排序的ImmutableMultiset,但是我只是难以获得它的一部分。

我从其他stackOverFlow question

获得了排序方面
ImmutableMultiset<String> orderedMultiset = Multisets.copyHighestCountFirst(keys);

对于子集方面,我尝试使用MinMaxPriorityQueue,以便我可以使用maximumSize(200)。

MinMaxPriorityQueue<String> orderedSubset = MinMaxPriorityQueue.maximumSize(200).create(orderedMultiset);

但它似乎只返回200个键的随机选择。检查orderedMultiset中的最高值甚至不会出现在返回的MinMaxPriorityQueue中。我也害怕,即使它确实得到它们,我可能最终只得到几个不同的键,其中总计数为200.而且我最好还有200个不同的键,每个都有计数。 / p>

我问了一个人,他们提到了一些关于POJO和Comparable的事情,但我并没有按照他们的建议行事。由于POJO无法真正实现可比较的定义。我不太确定。

我也在使用guava Ordering,但我认为这不会起作用,因为函数会使用Strings并且不知道来自multiset的计数。

MinMaxPriorityQueue<String> strings = MinMaxPriorityQueue.orderedBy(topKCount).maximumSize(200).create(multisets);


    private final Ordering<String> topKCount = Ordering.natural()
        .onResultOf(new Function<String, String>() {
            @Override
            public String apply(String keys) {
                //todo
            }
        });

有谁知道我在这里做错了什么,或者至少指出了正确的方向。感谢

3 个答案:

答案 0 :(得分:6)

如果您只想获得200个最常用的密钥,则可以Multisets.copyHighestCountFirst(multiset).elementSet().asList().subList(0, 200)。如果您愿意,可以使用它来填充另一个ImmutableMultiset,其中包含这些元素及其原始多重集中的相应计数。

答案 1 :(得分:0)

MinMaxPriorityQueue解决方案不起作用,因为Iterable的{​​{1}}视图仅包含元素,而不包含其数量。选择看起来是随机的,因为元素是按元素本身排序的,而不是它们的频率计数。

您几乎可以使用Multiset解决方案 - 只需使用原始Ordering进行比较:

Multiset

答案 2 :(得分:0)

尝试使用:

ImmutableSortedSet.Builder(Ordering.explicit(${List})) ......;

ImmuetablSortedSet按对象的List索引进行排序