Как посчитать моду?
У меня есть некий массив, нужно посчитать моду в данном массиве (вывести какое число повторяется несколько раз в массиве). Вот мой пример кода, но не понимаю, то ли я делаю.
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
Object sorted = listValue.stream().sorted().collect(Collectors.toList());
int list = Integer.parseInt(String.valueOf(listValue));
int max = 1;
int temp = 0;
for(int i = 0; i < listValue.size(); i++) {
if (hm.get(listValue) != null) {
int count = hm.get(listValue);
count++;
hm.put(list, count);
if(count > max) {
max = count;
temp = list;
}
}
else
hm.put(list,1);
}
return temp;
}
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Можно отсортировать и перебрать элементы парами:
List<Object> listValue = Arrays.asList(1, 4, 8, 7, 9, 4, 5);
List<Object> sorted = listValue.stream().sorted().collect(Collectors.toList());
for (int i = 1; i < sorted.size(); i++) {
Object prevValue = sorted.get(i - 1);
if (prevValue == sorted.get(i)) {
System.out.println(prevValue);
}
}
Можно посчитать элементы в словаре, так чтобы ключ=элемент, значение=количество, после вывести те, которых значение больше 1:
List<Object> listValue = Arrays.asList(1, 4, 8, 7, 9, 4, 5);
Map<Object, Integer> valueByCounter = new HashMap<>();
for (Object value : listValue) {
Integer counter = valueByCounter.getOrDefault(value, 0);
counter++;
valueByCounter.put(value, counter);
}
for (Map.Entry<Object, Integer> entry : valueByCounter.entrySet()) {
if (entry.getValue() > 1) {
System.out.println(entry.getKey());
}
}
Еще вариант нахождения дубликатов через сбор значений в списке, тут нужно проверить что если значение если в списке, значит дубликат, иначе добавить его в список:
List<Object> listValue = Arrays.asList(1, 4, 8, 7, 9, 4, 5);
List<Object> uniques = new LinkedList<>();
for (Object value : listValue) {
if (uniques.contains(value)) {
System.out.println(value);
} else {
uniques.add(value);
}
}