簡體   English   中英

在Java中的ArrayList中查找最常見/頻繁的元素

[英]Find most common/frequent element in an ArrayList in Java

我有一個包含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>並迭代數組以插入每個活動及其出現的活動。 但是,我將如何提取出現次數最多的活動?

你能救我一下嗎?

實現這樣的事情的最常見方式是使用Map :定義Map<MyEnum,Integer> ,它為枚舉的每個元素存儲零。 然后遍歷列表,並為列表中找到的每個元素遞增計數器。 同時,保持當前的max計數。 最后,遍歷計數器映射條目,並將所有條目的鍵與max的值相匹配的所有條目的鍵添加到輸出列表中。

在統計中,這稱為“模式” (在您的特定情況下, 也使用“多模式” ,因為您希望所有值最常出現,而不僅僅是一個)。 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λ背后的公司工作)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM