Итерация может быть заменена на массив 'Collection.addAll' - PullRequest
0 голосов
/ 30 ноября 2018

Итак, моя цель - заполнить массив y случайными числами от 1 до x, а затем посчитать, сколько раз каждое число дублируется, и распечатать его.Вот код:

int counter = 1;
    int length = random.length;
    Map<Integer, Integer> hashMap = new HashMap<>();
    for(int i = 0; i < length - 1; i++)
    {
        if(random[i] == random[i+1])
        {
            counter++;
        }
        else
        {
            hashMap.put(random[i], counter);
            System.out.println(random[i] + " duplicate : " + counter + " times.");
            counter = 1;
        }
    }

И моя проблема заключается в том, что если statment, он не покажет, сколько раз последнее число дублируется, потому что он добавит один к счетчику и не сохранит его.Как я мог это исправить?Если у вас есть идеи в целом, как я могу сделать это лучше, тогда используйте for +, если с массивом, иди и дай мне подсказку.Заранее спасибо за помощь.

Ответы [ 6 ]

0 голосов
/ 02 декабря 2018

Использование toMap!

Arrays.stream(random).boxed().collect(toMap(Function.identity(), v -> 1, Math::addExact));
0 голосов
/ 01 декабря 2018

С Java8 + вы можете использовать Map.merge:

Map<Integer, Integer> hashMap = new HashMap<>();
for (int n : random) {
    hashMap.merge(n, 1, Integer::sum);
}

, что гласит: для каждого числа n в массиве random, положитьэто на карте со значением 1, и, если оно уже присутствует, суммируйте 1 с его значением .

0 голосов
/ 01 декабря 2018

Если вы открыты для использования сторонней библиотеки с примитивными коллекциями, есть пара подходов, которые будут работать с Eclipse Collections .

Вариант 1. Использование MutableIntIntMap

MutableIntIntMap map = IntIntMaps.mutable.empty();
Arrays.stream(random).forEach(i -> map.addToValue(i, 1));
map.forEachKeyValue((k, v) ->
        System.out.println(k + " duplicate : " + v + " times."));

Вариант 2: использовать MutableIntBag

IntBags.mutable.with(random)
        .forEachWithOccurrences((i, counter) ->
                System.out.println(i + " duplicate : " + counter + " times."));

Этот блог дает хорошее введение вBag структура данных в коллекциях Eclipse.

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

0 голосов
/ 30 ноября 2018

Один из возможных способов итерации:

IntStream.range(0, length - 1).forEach(i -> {
    if (hashMap.containsKey(random[i])) {
        int current = hashMap.get(random[i]);
        hashMap.put(random[i], current + 1); // increment the count corresponding to the key
    } else {
        hashMap.put(random[i], 1); // initialise the count from 1
    }
});
// print the value and its count
hashMap.forEach((key, value) -> System.out.println(key + " duplicate : " + value + " times."));
0 голосов
/ 30 ноября 2018
Map<Integer, Long> map = Arrays.stream(random)
                .boxed()
                .collect(Collectors.groupingBy(Function.identity(),
                                               Collectors.counting()));
0 голосов
/ 30 ноября 2018

Вам нужно проверить, присутствует ли ключ в hashMap, если да, затем получить значение из этого ключа и обновить его с инкрементом, иначе добавьте как новое значение ключа в хэш-карту.

перед java8

пример;

Map<Integer, Integer> hashMap = new HashMap<>();

for(int i = 0; i < random.length; i++)
    if (hashMap.containsKey(random[i])) {
       hashMap.put(random[i], (hashMap.get(random[i])+1))
    } else {
       hashMap.put(random[i], 1)
    }
}

теперь ключ представит ваше случайное число и его значение будет отображать общее количество дубликатов

с java8

    IntStream
            .range(0, random.length)
            .forEach(i -> {
                hashMap.compute(random[i], (k, v) -> v == null ? 1 : v +1);
            });
...