在Java中的ArrayList中查找最常见/频繁的元素

时间:2013-03-24 16:27:24

标签: java arrays arraylist frequency

我有一个包含5个元素的数组列表,每个元素都是一个枚举。我想构建一个方法,该方法返回另一个列表中包含最常见元素的数组列表。

示例1:

[Activities.WALKING, Activities.WALKING, Activities.WALKING, Activities.JOGGING, Activities.STANDING]

方法将返回:[Activities.WALKING]

示例2:

[Activities.WALKING, Activities.WALKING, Activities.JOGGING, Activities.JOGGING, Activities.STANDING]

方法将返回:[Activities.WALKING, Activities.JOGGING]

我做了什么:

我的想法是为每个活动声明一个计数但这意味着如果我想添加另一个活动,我必须去修改代码以为该活动添加另一个计数。

另一个想法是声明一个HashMap<Activities, Integer>并迭代数组以插入每个活动及其出现的活动。但是,我将如何提取出现次数最多的活动?

你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

实现这样的事情的最常见方式是使用Map进行计数:定义一个Map<MyEnum,Integer>,它为枚举的每个元素存储零。然后遍历列表,并为列表中找到的每个元素递增计数器。同时,保持当前max计数。最后,遍历计数器映射条目,并将所有条目的键与max的值匹配的所有条目的键添加到输出列表中。

答案 1 :(得分:0)

In statistics, this is called the "mode"(在您的具体情况下,"multi mode" is also used,因为您想要最常出现的所有值,而不仅仅是一个值。 vanilla Java 8解决方案如下所示:

Map<Activities, Long> counts =
Stream.of(WALKING, WALKING, JOGGING, JOGGING, STANDING)
      .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

long max = Collections.max(counts.values());
List<Activities> result = counts
      .entrySet()
      .stream()
      .filter(e -> e.getValue().longValue() == max)
      .map(Entry::getKey)
      .collect(Collectors.toList());

哪个收益率:

[WALKING, JOGGING]

jOOλ是一个支持流上modeAll()的库。以下程序:

System.out.println(
    Seq.of(WALKING, WALKING, JOGGING, JOGGING, STANDING)
       .modeAll()
       .toList()
);

收率:

[WALKING, JOGGING]

(免责声明:我为jOOλ背后的公司工作)