在Multiset中选择具有最大出现次数的元素

aks*_*ayb 8 java collections guava

我可能想将问题改为"如何在Multiset中选择第一项?" 因为似乎Multiset已按照频率排序.

我有一个Multiset myList = Multiset.create();

[maa00 mfnt11 malignlft mbold mlt18 mfl x 3, caa00 cfnt11 calignlft cbold clt17 cfl]
Run Code Online (Sandbox Code Playgroud)

我找不到像myList.getIndex(0)这样的方法.请注意,最后,我需要具有最大频率的元素数.

这个有衬垫吗?或者我必须做那个迭代?

更新:我使用以下方式获得最高频率:

myList.count(Multisets.copyHighestCountFirst(myList).asList().get(0)));
Run Code Online (Sandbox Code Playgroud)

但这太慢了.你能建议一下,我应该用什么?

更新1:使用上面的copyHighestCountFirst方法证明太慢了.在循环的一个实例中,在没有它的情况下使用80 +毫秒而不是平均40毫秒.在大型循环中,我应该更喜欢简单的迭代吗?

更新2:使用它:

myList.count(myList.entrySet().iterator().next().getElement())
Run Code Online (Sandbox Code Playgroud)

对性能几乎没有影响.我仍然想知道是否有更好的方法来做到这一点.

旁注:在Python中,我做了同样的事情:

j = defaultdict(int)
for k in clList:
    j[k] +=1
result1 = max(j.iteritems(), key=lambda x:x[1]) //count of frequency of item with max count
Run Code Online (Sandbox Code Playgroud)

Kev*_*ion 14

在您的问题与发布的其他答案之间存在很多替代方案,但其中许多似乎依赖于.get(0).iterator().next()将会为您提供最常见元素的想法.它不会!

你只有两个不错的选择Multisets.copyHighestCountFirst(bag).elementSet().iterator().next(),就像你说的那样浪费,或者entrySet手动循环并检查每一个以确定它是否是迄今为止最常见的.

您应该提交Guava功能请求以提取最常见的元素.我不能保证会发生什么,但值得请求.


小智 5

我今天遇到了类似的挑战,试图找到一种简单、合理有效的方法来查找Multiset具有最大计数的元素。在我们生活在 Java 8 的未来,我能够将 Louis Wasserman 的解决方案修改为一个干净的单行:

multiset.entrySet().stream().max(Ordering.natural().onResultOf(Multiset.Entry::getCount)).get();

这将为您Multiset.Entry提供最大计数(假设multiset不为空),允许您访问元素或其计数。