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

jon*_*ine 2 java priority-queue multiset guava

我有

Multiset<String> keys
Run Code Online (Sandbox Code Playgroud)

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

我从其他stackOverFlow问题得到了排序方面

ImmutableMultiset<String> orderedMultiset = Multisets.copyHighestCountFirst(keys);
Run Code Online (Sandbox Code Playgroud)

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

MinMaxPriorityQueue<String> orderedSubset = MinMaxPriorityQueue.maximumSize(200).create(orderedMultiset);
Run Code Online (Sandbox Code Playgroud)

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

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

我也在使用番石榴订购,但我认为这不会起作用,因为函数将采用字符串并且不知道来自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
            }
        });
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*man 6

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