Подсчитать общее количество повторяющихся элементов в 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()));
}
}
Все это можно упростить, но рефакторинг уже на вашей совести
В обычном, процедурном стиле:
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
}
}
Судя по вопросу - задание для учебного заведения. Следовательно нужно попроще и понятнее.
Самым простым видится алгоритм таким: 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 все повторяющиеся.