Поиск наиболее частой строки в отсортированном списке ArrayList без использования HashMap

Рассмотрение 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, когда нам нужно найти наиболее распространенный элемент?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
101
1

Ответы 1

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

Большое спасибо за ваше решение! если я правильно понял ваш цикл, в конце цикла вы вернете наивысшее число, что удивительно, но не имя животного, связанного с ним. Кроме того, скажите мне, если я ошибаюсь, подсчет с использованием хэш-карт приведет к временной сложности O (n), а сортировка с использованием Collection.sort - O (n log n) + цикл for, чтобы найти максимальное значение, которое должно быть O (n) итак, в конце концов, O (n log n) + O (n)?

jaymartines 08.12.2018 23:27

@jaymartines Да, цикл, который я показал, был просто иллюстрацией того, что найти самый лучший элемент в отсортированном намного проще, чем в несортированном. И да, использование HashMap допускает только одну итерацию по циклу, поэтому он имеет лучшую временную сложность, при условии, что List не отсортирован.

GBlodgett 08.12.2018 23:32

Другие вопросы по теме