Как я могу определить (вернуть истину / ложь), содержит ли ArrayList более одного и того же элемента в Java?
Большое спасибо, Терри
Изменить Забыл упомянуть, что я не хочу сравнивать «блоки» друг с другом, а сравнивать их целые числа. У каждого «блока» есть int, и это их отличает. Я нахожу int конкретного блока, вызывая метод с именем "getNum" (например, table1 [0] [2] .getNum ();
Ответы:
Самый простой: выгрузите всю коллекцию в Set (используя конструктор Set (Collection) или Set.addAll), затем посмотрите, имеет ли Set тот же размер, что и ArrayList.
Обновление: если я правильно понимаю ваш вопрос, у вас есть 2-й массив блоков, как в
Таблица блоков [] [];
и вы хотите определить, есть ли дубликаты в какой-либо строке?
В этом случае я мог бы сделать следующее, предполагая, что Block правильно реализует «equals» и «hashCode»:
Я не уверен на 100% в этом синтаксисе, поэтому может быть безопаснее написать его как
Set.add
возвращает логическое значение false, если добавляемый элемент уже находится в наборе, так что вы можете даже закоротить и выгрузить любое возвращаемое добавление,false
если все, что вы хотите знать, - есть ли какие-либо дубликаты.источник
Улучшенный код, использующий возвращаемое значение
Set#add
вместо сравнения размера списка и набора.источник
Set<T> set = new HashSet<T>(list.size());
:? Учитывая параметр List, я думаю, что было бы более эффективно, если бы список обычно не содержал дубликатов.HashSet
до размера списка приведет к изменению размера при просмотре всего списка из-за базового коэффициента загрузки хэш-структуры.Если вы хотите вообще избежать дубликатов, вам следует просто вырезать средний процесс обнаружения дубликатов и использовать Set .
источник
Улучшенный код для возврата повторяющихся элементов
источник
Если ваши элементы каким-то образом сопоставимы (тот факт, что порядок имеет какое-либо реальное значение, безразличен - он просто должен соответствовать вашему определению равенства), самое быстрое решение для удаления дубликатов будет отсортировать список (0 (n log ( n))) затем сделать один проход и искать повторяющиеся элементы (то есть равные элементы, следующие друг за другом) (это O (n)).
Общая сложность будет O (n log (n)), что примерно такое же, как у Set (n times long (n)), но с гораздо меньшей константой. Это связано с тем, что константа в сортировке / дедупликации является результатом стоимости сравнения элементов, тогда как стоимость из набора, скорее всего, будет результатом вычисления хеша плюс одно (возможно, несколько) сравнений хешей. Если вы используете реализацию Set на основе хэшей, то есть потому, что Tree based даст вам O (n log² (n)), что еще хуже.
Однако, насколько я понимаю, вам не нужно удалять дубликаты, а просто проверять их наличие. Таким образом, вы должны вручную запрограммировать алгоритм сортировки слияния или кучи в своем массиве, который просто завершает работу с возвратом истины (т. Е. «Есть дублирование»), если ваш компаратор возвращает 0, и в противном случае завершает сортировку и проходит тестирование отсортированного массива на наличие повторов. . Действительно, при сортировке слиянием или кучей, когда сортировка завершена, вы будете сравнивать каждую повторяющуюся пару, если оба элемента уже не были в своих конечных положениях (что маловероятно). Таким образом, измененный алгоритм сортировки должен дать огромное улучшение производительности (мне нужно было бы это доказать, но я думаю, что измененный алгоритм должен быть в O (log (n)) для равномерно случайных данных)
источник
Мне нужно было проделать аналогичную операцию для a
Stream
, но я не смог найти хороший пример. Вот что я придумал.Это дает преимущество короткого замыкания, когда дубликаты обнаруживаются на ранней стадии, вместо того, чтобы обрабатывать весь поток, и не намного сложнее, чем просто поместить все в a
Set
и проверить размер. Итак, этот случай будет примерно таким:источник
С Java 8+ вы можете использовать Stream API:
источник
Проще говоря: 1) убедитесь, что все элементы сопоставимы 2) отсортируйте массив 2) переберите массив и найдите дубликаты
источник
Чтобы узнать дубликаты в списке, используйте следующий код: Он даст вам набор, содержащий дубликаты.
источник
лучший способ справиться с этой проблемой - использовать HashSet :
Просто распечатайте массив результатов и посмотрите результат без дубликатов :)
источник
Если вам нужен набор повторяющихся значений:
И, вероятно, также подумайте об обрезке значений или использовании строчных букв ... в зависимости от вашего случая.
источник
Примечание: это существенно снизит производительность, поскольку элементы будут удалены из начала списка. Чтобы решить эту проблему, у нас есть два варианта. 1) выполнить итерацию в обратном порядке и удалить элементы. 2) Используйте LinkedList вместо ArrayList. Из-за предвзятых вопросов, задаваемых в интервью для удаления дубликатов из списка без использования какой-либо другой коллекции, приведенный выше пример является ответом. Однако в реальном мире, если мне нужно добиться этого, я просто помещу элементы из списка в набор!
источник
Пример конкретного класса, который переопределил
equals()
:источник
источник
Этот ответ написан на Kotlin, но его легко перевести на Java.
Если размер вашего Arraylist находится в фиксированном небольшом диапазоне, это отличное решение.
источник
источник