Как определить максимальную частоту целых чисел в массиве?

#java

#java

Вопрос:

Меня попросили написать программу в тестовом экзамене codility, чтобы написать функцию, которая проверяет максимальную частоту целых чисел в массиве A, возвращая значение: например:

 A[0]: 10
A[1]: 7
A[2]: 10
A[3]: 10 
  

Будет выводиться как 10

 class Solution {
    public int solution(int[] A) {
        // write your code in Java SE 8
  int count = 1, tempCount;
  int mostOften = A[0];
  int temp = 0;
  for (int iCounter = 0; iCounter < (A.length - 1); iCounter  )
  {
    temp = A[iCounter];
    tempCount = 0;
    for (int jCounter = 1; jCounter < A.length; jCounter  )
    {
      if (temp == A[jCounter])
        tempCount  ;
    }
    if (tempCount > count)
    {
      mostOften = temp;
      count = tempCount;
    }
  }
  return mostOften;
}
}
  

Комментарии:

1. Вам потребуется только один проход через массив. У вас есть вложенный цикл, поэтому вам нужно избавиться от этого.

2. Кроме того, «используя java SE 8», я предполагаю, что они говорят вам использовать потоки. Используется Arrays.stream() для создания потока из массива.

Ответ №1:

Самым простым подходом было бы передать массив в потоковом режиме и преобразовать его в частотную карту, выполнить обратную сортировку по количеству и взять первый элемент:

 public int solution(int[] a) {
    return Arrays.stream(a)
                 .boxed()
                 .collect(Collectors.groupingBy
                              (Function.identity(), Collectors.counting()))
                 .entrySet()
                 .stream()
                 .sorted(Map.Entry.<Integer, Long> comparingByValue().reversed())
                 .findFirst()
                 .map(Map.Entry::getKey)
                 .get();
}