我有
Multiset<String> keys
我希望有一个拥有200个最常用键的Multiset。我已经弄清楚如何获得按频率排序的ImmutableMultiset,但是我只是难以获得它的一部分。
获得了排序方面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
}
});
有谁知道我在这里做错了什么,或者至少指出了正确的方向。感谢
答案 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索引进行排序