Java是否提供任何库来找出数组中最频繁的数字?

时间:2018-06-21 06:49:33

标签: java arrays

只是进一步解释标题的含义:

int[] array = {1,2,1,3,2,1,4};

在上面声明的数组中, 1 出现了3次,因此数组中的最大频率也是如此。 Java是否提供任何东西可以找到答案?

1 个答案:

答案 0 :(得分:4)

您可以为此使用新的Java 8 Streaming API:

int[] array = {1, 2, 1, 3, 2, 1, 4};
Optional<Integer> max = Arrays.stream(array)    // IntStream
    .boxed()                                    // Stream<Integer>
    .collect(Collectors.groupingBy(
        Function.identity(), 
        Collectors.counting())
    )                                           // Map<Integer, Long>
    .entrySet()                                 // Set<Map.Entry<Integer, Long>>
    .stream()                                   // Stream<Map.Entry<Integer, Long>>
    .max(Comparator.comparing(Entry::getValue)) // Optional<Map.Entry<Integer, Long>>
    .map(Map.Entry::getKey);                    // Optional<Integer>

我评论了每一行,在该行之后返回了当前返回的类型,以明确说明我们当前正在使用的类型。

简而言之,我们从数组创建一个Stream,然后计算每个出现的不同整数,然后选择出现次数最多的一个整数。

Optional<Integer>之所以返回,是因为该流可以为空,但在您的情况下,该可选项将始终保留一个值。

您可以从多种可选方式中提取值:

  1. int i = max.get();如果不存在任何值,则可能会引发异常
  2. int i = max.orElse(-1);允许您设置默认值