Рассмотрение ArrayList из String, содержащих
animalsArray[dog, cat, dog, dog, cat, duck, duck, dog]
Я мог бы легко использовать HashMap, чтобы найти наиболее распространенный String, используя значение HashMap в качестве счетчика и ключ для хранения имени животного.
Если ArrayList был отсортирован
[dog, dog, dog, dog, cat, cat, duck, duck]
Как проще всего найти наиболее распространенный элемент без использования Hashmaps? Я думал об использовании цикла for для сравнения animalArray.get(i) с animalArray.get(i-1), но мне не удалось разработать это решение. И каковы преимущества, если они есть, наличия отсортированного ArrayList, когда нам нужно найти наиболее распространенный элемент?




What is the easiest way to find the most common element without using Hashmaps?
Я бы сказал (Java 8+), что это довольно просто:
String str = list.stream()
.distinct()
.max(Comparator.comparing(e -> Collections.frequency(list, e)))
.get();
Это создаст Stream из List и найдет элемент с наибольшей частотой в List.
And what are the advantages, if there are any, of having a sorted ArrayList when we need we need to find the most common element?
Представьте себе несортированный List:
[dog, cat, turtle, cat, dog, snake]
Для каждого элемента вам придется поискать остальную часть List, чтобы узнать, сколько раз он встречается.
Однако с отсортированным List:
[dog, dog, cat, cat, snake, turtle]
У вас должен быть только счетчик, чтобы отслеживать самый длинный подсписок, содержащий те же элементы. Затем он превращается в нечто вроде (псевдокода):
//T being the type of the List
T element
int count = 0;
int biggestCount = 0;
for(every element in the list) {
if the item is the same as previous
count++
else
//Only check when we're about to change elements
if count > biggestCount
biggestCount = count
element = current element of List
//Starting over with a new element
count = 1
}
return element
@jaymartines Да, цикл, который я показал, был просто иллюстрацией того, что найти самый лучший элемент в отсортированном намного проще, чем в несортированном. И да, использование HashMap допускает только одну итерацию по циклу, поэтому он имеет лучшую временную сложность, при условии, что List не отсортирован.
Большое спасибо за ваше решение! если я правильно понял ваш цикл, в конце цикла вы вернете наивысшее число, что удивительно, но не имя животного, связанного с ним. Кроме того, скажите мне, если я ошибаюсь, подсчет с использованием хэш-карт приведет к временной сложности O (n), а сортировка с использованием Collection.sort - O (n log n) + цикл for, чтобы найти максимальное значение, которое должно быть O (n) итак, в конце концов, O (n log n) + O (n)?