public static <T> T mostCommon(List<T> list) {
Map<T, Integer> map = new HashMap<>();
for (T t : list) {
Integer val = map.get(t);
map.put(t, val == null ? 1 : val + 1);
}
Entry<T, Integer> max = null;
for (Entry<T, Integer> e : map.entrySet()) {
if (max == null || e.getValue() > max.getValue())
max = e;
}
return max.getKey();
}
List<Integer> list = Arrays.asList(1,3,4,3,4,3,2,3,3,3,3,3);
System.out.println(mostCommon(list));
10条答案
按热度按时间ikfrs5lh1#
如果你愿意使用谷歌Guava,你可以使用它的
MultiSet
课程:现在,排序
copies
按其值递减。uqzxnwby2#
也许用Guava最简单的解决方法是
这是一个完整的解决方案,而且比我看到讨论的其他替代方案要短。
agxfikkp3#
下面是louis答案的扩展,支持多个元素具有相同的最大出现次数的情况:
kg7wmglp4#
下面是一个纯Java8解决方案(注意:不要使用这个,请参见下文):
另一种解决方案是,根据元素的频率将元素收集到一个Map中,然后找到具有最大值的条目并返回其键(基本上与arshajii的答案相同,使用java8编写):
更新:如果最常见的元素不止一个,并且您希望将所有元素都包含在一个集合中,我建议使用两种方法:
方法a:将原始集合收集到以键为元素、值为其出现次数的Map后,获取具有最大值的条目,并过滤具有与我们找到的最大值(if)相等的值的Map条目。像这样:
方法b:将原始集合收集到以键作为元素、值作为其出现次数的Map后,将此Map转换为以键作为出现次数、值作为具有此出现次数的元素列表的新Map。然后用一个比较键的自定义比较器找到这个Map的max元素,并得到这个条目的值。这样地:
1mrurvl15#
这很容易自己实现:
如果要处理存在多个最频繁元素的情况,可以扫描列表一次以确定最频繁元素出现的次数,然后再次扫描列表,将这些元素放入一个集合中并返回该集合。
zfycwa2u6#
查找集合中最常用的项目:
lhcgjxsq7#
我们可以轻松地在一次迭代中完成:
34gzjxbg8#
Guava提供了一种方法,将有助于,虽然它的效率低于路易斯的解决方案。
wfsdck309#
在统计学中,这被称为“模式”。普通java 8解决方案如下所示:
由此产生:
乔λ 是一个支持
mode()
在溪流上。以下程序:产量:
为了简单起见,我省略了使用
BigDecimal
. 不过,解决办法是一样的。(免责声明:我为joo背后的公司工作λ)
r6hnlfcb10#
实现这一点的经典方法是对列表进行排序,然后逐一进行处理:
这比使用散列来计数要节省一些空间,因为它可以对数组进行适当的排序。您可以将其放入泛型类并用t替换biginteger,或者只使用object代替biginteger。