Найти максимальное значение в Hashmap и вернуть ключ minumum - PullRequest
0 голосов
/ 01 января 2019

У меня есть массив целых чисел, и я хочу знать, какое число было повторено больше, чем остальные. Если у нас есть два числа, которые повторяются одинаково, моя программа должна вернуть число с индексом min.

Например,: У меня есть список массивов, которые сохраняются ниже чисел.

ArrayList<Integer> list = new ArrayList<>();
list.add(9);
list.add(0);
list.add(1);
list.add(1);
list.add(9);

, поэтому я создал Hashmap для сохранения числа в качестве ключа и его частоты в качестве значения

HashMap<Integer, Integer> list1 = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
    list1.put(list.get(i), Collections.frequency(list, list.get(i)));
}

, так как у меня есть два числа "1,9 ", что повторяется" 2 раза ", моя программа должна вернуть 1, потому что у каждого есть минимальный индекс.так как я могу найти максимальное значение в hashmap и вернуть минимальный индекс

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я бы предложил использовать коллектор groupingBy вместо frequency, а затем использовать потоковый API для применения дальнейших операций для уточнения вашего запроса.

 Optional<Integer> key = list.stream() // Stream<Integer>
            .collect(groupingBy(Function.identity(), counting())) // Map<Integer, Long>
            .entrySet().stream() //Stream<Entry<Integer, Long>>
            .max(Comparator.comparingLong((ToLongFunction<Map.Entry<Integer, Long>>) Map.Entry::getValue)
                    .thenComparingInt(s -> -s.getKey())) // Optional<Entry<Integer, Long>> // Optional<Entry<Integer, Long>>
            .map(Map.Entry::getKey); //Optional<Integer>
  • , предоставляющих groupingBy сборщик для метода collect позволяет нам сгруппировать каждый элемент в источнике list и, как результат, иметь Map<Integer, Long>, где каждая запись представляет элемент и количество раз, которое оно встречается в источнике list.
  • Затем мы находим максимальное значение в Hashmap и возвращаем минимальный ключ.
  • Наконец, у нас есть Optional<Integer>, содержащий ключ, в противном случае - пустой необязательный параметр.

Запустив этот код для предоставленных вами примеров данных, вы получите число 1, соответствующее вашим требованиям.

Поскольку вы упомянули, что числа в списке представляют индексыэтого должно быть достаточно.


Если вы не знакомы с Optional<T> API, я бы посоветовал просмотреть документацию здесь .

0 голосов
/ 01 января 2019

Вам необходимо использовать LinkedHashMap для поддержания порядка вставки в Map, а затем вы можете использовать лямбду для индексации с максимальным значением, которое идет первым в индексе, как показано ниже:

List<Integer> list = new ArrayList<>();
        list.add(9);
        list.add(0);
        list.add(1);
        list.add(1);
        list.add(9);

        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < list.size(); i++) {
            map.put(list.get(i), Collections.frequency(list, list.get(i)));
        }
        System.out.println(map);
        System.out.println(Collections.max(map.entrySet(),
        Comparator.comparingInt(entry -> entry.getValue())).getKey());

O / P:

{9 = 2, 0 = 1, 1 = 2}

9

Если вы хотите индексировать с помощью клавиши min, замените выше LinkedHashMap на следующее:

SortedMap<Integer, Integer> map = new TreeMap<>();

Это даст 1 в качестве вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...