Массив Java 8 int для сопоставления - PullRequest
4 голосов
/ 01 июня 2019

Я хочу преобразовать int массив в

Map<Integer,Integer> 

с использованием Java 8 Stream API

int[] nums={2, 7, 11, 15, 2, 11, 2};
Map<Integer,Integer> map=Arrays
                .stream(nums)
                .collect(Collectors.toMap(e->e,1));

Я хочу получить карту, как показано ниже, ключом будет целочисленное значение, значением будет общее количество каждого ключа

map = {2-> 3, 7-> 1, 11-> 2, 15-> 1}

компилятор жалуется: " нет экземпляра (ов) типа (ов) переменной T, U, поэтому Integer подтверждает функцию "

оцените любые указатели, чтобы решить эту проблему

Ответы [ 3 ]

8 голосов
/ 01 июня 2019

Вам нужно указать IntStream, а затем использовать значение groupingBy, чтобы получить счет:

Map<Integer, Long> map = Arrays
        .stream(nums)
        .boxed() // this
        .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

или используйте reduce как:

Map<Integer, Integer> map = Arrays
        .stream(nums)
        .boxed()
        .collect(Collectors.groupingBy(e -> e,
                Collectors.reducing(0, e -> 1, Integer::sum)));
3 голосов
/ 01 июня 2019

Вы должны позвонить .boxed() в вашем потоке, чтобы преобразовать IntStream в Stream<Integer>. Затем вы можете использовать Collectors.groupingby() и Collectors.summingInt() для подсчета значений:

Map<Integer, Integer> map = Arrays.stream(nums).boxed()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(i -> 1)));
2 голосов
/ 04 июня 2019

Вы также можете выполнить подсчет целых чисел, не упаковывая значения int в Map<Integer, Integer> или Map<Integer, Long>.Если вы используете Eclipse Collections , вы можете преобразовать IntStream в IntBag следующим образом.

int[] nums = {2, 7, 11, 15, 2, 11, 2};
IntBag bag = IntBags.mutable.withAll(IntStream.of(nums));
System.out.println(bag.toStringOfItemToCount());

Выходы:

{2=3, 7=1, 11=2, 15=1}

Вы также можетесоздайте IntBag непосредственно из массива int.

IntBag bag = IntBags.mutable.with(nums);

Примечание: я являюсь коммиттером для коллекций Eclipse.

...