0

我有一个包含 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]

我尝试了什么:

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

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

你们能帮帮我吗?

4

2 回答 2

2

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

于 2013-03-24T16:32:45.880 回答
0

在统计中,这称为“模式”(在您的特定情况下,也使用“多模式”,因为您想要最常出现的所有值,而不仅仅是一个)。一个普通的 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λ 背后的公司工作)

于 2016-03-20T15:32:16.080 回答