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功能请求以提取最常见的元素.我不能保证会发生什么,但值得请求.