Подсчет дубликатов в списке массивов - PullRequest
0 голосов
/ 30 ноября 2018
Arraylist al = new ArrayList();

Random r = new Random();

int arr[] = new int[100];

for (int i = 0; i < arr.length; i++) { // assuming the array variable is named arr...
    arr[i] = r.nextInt(200);
    al.add(arr[i]);
}

Вывод должен быть таким:

Duplicates:2

Values 2 : count=4

Values 99: count=96

Без использования хеш-функций Jdk 1.6_04

Ответы [ 2 ]

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

Более простое решение было бы:

al.stream().distinct()
                .forEach(v -> System.out.println("Values " + v + " : count=" + Collections.frequency(al, v)));

Получить поток, состоящий из отдельных элементов, затем подсчитать количество элементов в списке с помощью Collections.frequency()

Обновить: если вы 'Не разрешается использовать функции Java 8:

Set<Integer> distinctSet = new HashSet<>(al);
for(int i: distinctSet) {
    System.out.println("Valuess " + i + " : count=" + Collections.frequency(al, i));
}
0 голосов
/ 30 ноября 2018

Вот один из способов:

new Random().ints(100, 0, 200) // 100 is streamSize , 0 is randomNumberOrigin, 200 is randomNumberBound
            .boxed()
            .collect(groupingBy(Function.identity(), counting()))
            .forEach((k, v) -> System.out.println("Values " + k + " count" + v));

или, если вы хотите получить результат в списке:

List<String> result = new Random().ints(100, 0, 200) // 100 is streamSize , 0 is randomNumberOrigin, 200 is randomNumberBound
                .boxed()
                .collect(groupingBy(Function.identity(), counting()))
                .entrySet().stream()
                .map(e -> "Values " + e.getKey() + " count" + e.getValue())
                .collect(Collectors.toList());

Другой подход был бы с toMap:

List<String> res = new Random().ints(100, 0, 200) // 100 is streamSize , 0 is randomNumberOrigin, 200 is randomNumberBound
                .boxed()
                .collect(toMap(Function.identity(), e -> 1, Math::addExact))
                .entrySet().stream()
                .map(e -> "Values " + e.getKey() + " count" + e.getValue())
                .collect(Collectors.toList());

Редактировать:

, если вы удалили тег Java 8, вот решение для полноты:

List<Integer> al = new ArrayList<>();
Set<Integer> accumulator = new HashSet<>();

Random r = new Random();

for (int i = 0; i < 100; i++) {
     int result = r.nextInt(200);
     al.add(result);
     accumulator.add(result);
}

for (Integer i : accumulator) {
     System.out.println("Values " + i + " : count=" + Collections.frequency(al, i));
}

+ 1 к @Хюля за предложение Collections.frequency сначала.

...