Подсчитать общее количество повторяющихся элементов в Java

Вопрос по Java. У меня есть массив:

int[] a = {1,2,3,2,5,2,5}

Надо подсчитать общее количество повторяющихся элементов.

Программа должна вывести 2,так как повторяющихся элементы: 2,5. Как можно реализовать?


Ответы (4 шт):

Автор решения: Дмитрий

Для начала попробуйте выкладывать свое решение. В этом случае допускаю, что идей просто не было, посему попробуйте разобрать функциональное решение.

import java.util.Arrays;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {

        int[] arr = {1,2,3,2,5,2,5};

        //можно так
        Set<Integer> allElements = Arrays.stream(arr).boxed().collect(Collectors.toSet());
        Arrays.stream(arr).boxed().filter(i->!allElements.remove(i)).distinct().forEach(System.out::println);    

        //а можно так 
        Arrays.stream(arr).boxed()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .entrySet().stream().filter(e->e.getValue()>1).forEach(e -> System.out.println(e.getKey()));

    }

}

Все это можно упростить, но рефакторинг уже на вашей совести

→ Ссылка
Автор решения: insolor

В обычном, процедурном стиле:

import java.util.HashMap;
import java.util.Map;

class Scratch {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 2, 5, 2, 5};

        // Посчитать сколько раз каждое значение встречается в массиве
        Map<Integer, Integer> counter = new HashMap<>();
        for (int x : a) {
            int newValue = counter.getOrDefault(x, 0) + 1;
            counter.put(x, newValue);
        }

        System.out.println(counter);  // Вывод: {1=1, 2=3, 3=1, 5=2}
        // т.е. 1 встретилось 1 раз, 2 - 3 раза, 3 - 1 раз, 5 - 2 раза

        // Посчитать количество значений, которые встречаются чаще одного раза
        int count = 0;
        for (int value : counter.values()) {
            if (value > 1) {
                count++;
            }
        }

        System.out.println(count); // Вывод: 2
    }
}
→ Ссылка
Автор решения: Rattlefire

Судя по вопросу - задание для учебного заведения. Следовательно нужно попроще и понятнее.

Самым простым видится алгоритм таким: 1) с первого по последний элемент массива проверить на равенство нулю. 1а) если нулей 2 или больше - присвоить переменной n значение 1, иначе 0. 2) перебор с первого по последний элемент массива: если элемент массива больше нуля, то сравнить его со всеми оставшимися элементами массива. 2а) при нахождении равных ему элементов массива - приравнивать их к нулю, переменную flag приравнять к 1. 2б) если flag равен 1 - присвоить переменной n значение n + 1. 2в) после сравнения приравнять элемент из пункта 2) к нулю. Приравнять flag к 0.

Повторять шаги 2) ... 2в) до последнего элемента массива. Вывести n.

иначе - вводить ещё переменные для запоминания позиций элементов в массиве ну и/или усложнение алгоритма, при том же результате.

→ Ссылка
Автор решения: Дмитрий Никифоров

С двумя Set-ами можно сделать за один проход массива.

int[] a = {1, 2, 3, 2, 5, 2, 5};
HashSet<Integer> distinct = new HashSet<>();
HashSet<Integer> repetitive = new HashSet<>();
for (int i: a) {
    if (distinct.contains(i)) {
        repetitive.add(i);
    } else {
        distinct.add(i);
    }
}
System.out.println(repetitive.size());

После этого в distinct будут все встреченные значения, а в repetitive все повторяющиеся.

→ Ссылка