У меня есть список типа Integer, например:
[1, 1, 2, 3, 3, 3]
Я хотел бы, чтобы метод возвращал все дубликаты, например:
[1, 3]
Как лучше всего это сделать?
java
collections
свежайшие
источник
источник
Ответы:
Способ
add
поSet
возвращает логическое значение , существует ли уже значение (правда , если она не существует, ложь , если она уже существует, см комплект документации ).Так что просто перебери все значения:
источник
for (Integer yourInt
, чтобы избежать ненужной упаковки и распаковки, тем более что ваш ввод уже содержитInteger
s.HashSet
вы также должны учитывать коэффициент загрузки, например, когда вы указываете начальную емкость100
, поскольку вы хотите добавить это количество элементов, оно округляется до следующей степени 2 (128
), что означает, что с коэффициентом загрузки по умолчанию0.75f
будет установлен порог изменения размера96
, поэтому изменение размера будет выполняться до того, как вы добавите100
элементы. К счастью, изменение размера теперь не так дорого. В современных JRE изменение размера больше не является перехэшированием, элементы просто распределяются между двумя возможными местоположениями результатов на основе соответствующего бита.Мне тоже нужно было решение. Я использовал решение Leifg и сделал его универсальным.
источник
Я взял решение Джона Стриклера и переделал его для использования потокового API, представленного в JDK8:
источник
distinct()
метод также сохраняет состояние. Не могу придумать эффективную (O (n)) отдельную операцию, которая не имеет состояния.Вот решение с использованием потоков с Java 8
Вы просто посмотрите, встречается ли частота этого объекта более одного раза в вашем списке. Затем вызовите .distinct (), чтобы в вашем результате были только уникальные элементы
источник
Collections::frequency
равно O (n). Чтобы определить частоту появления элемента, необходимо просмотреть всю коллекцию. И мы вызываем это один раз для каждого элемента в коллекции, из которой создаются эти фрагментыO(n^2)
. Вы заметите разницу в любой коллекции, состоящей из нескольких элементов. Я бы никогда не использовал это в реальном коде.базовое решение java 8:
источник
Очевидно, вы можете делать с ними все, что захотите (например, вставлять Set для получения уникального списка повторяющихся значений) вместо печати ... Это также имеет преимущество записи местоположения повторяющихся элементов.
источник
Использование Guava на Java 8
источник
Это тоже работает:
источник
Вы можете использовать что-то вроде этого:
источник
int
как тип переменной. Это означает, что для каждой итерации Integer распаковывается один раз, а int - четыре раза!Ламбасы могут быть решением
источник
Используйте MultiMap, чтобы сохранить каждое значение как набор ключей / значений. Затем переберите ключи и найдите те, которые имеют несколько значений.
источник
Если вы используете Коллекции Eclipse , это будет работать:
Обновление: начиная с Eclipse Collections 9.2, теперь вы можете использовать
selectDuplicates
Для этого вы также можете использовать примитивные коллекции:
Примечание: я являюсь приверженцем коллекций Eclipse.
источник
источник
Подобно некоторым ответам здесь, но если вы хотите найти дубликаты на основе некоторого свойства:
источник
создать
Map<Integer,Integer>
, выполнить итерацию списка, если элемент находится на карте, увеличить его значение, в противном случае добавить его на карту с ключом = 1, выполнить итерацию карты и добавить в списки все элементы с ключом> = 2
источник
Компактная обобщенная версия верхнего ответа, также добавлена пустая проверка и предварительно выделенный размер набора:
источник
tempSet
с ,listSize
когда это необходимо. Это небольшая оптимизация, но она мне нравится.Я взял ответ Себастьяна и добавил к нему keyExtractor -
источник
Поточно-ориентированная альтернатива такова:
источник
Попробуйте это, чтобы найти повторяющиеся элементы в списке:
источник
Это должно работать для отсортированных и несортированных.
источник
Это проблема, в которой сияют функциональные техники. Например, следующее решение F # является более ясным и менее подверженным ошибкам, чем лучшее императивное решение Java (и я ежедневно работаю как с Java, так и с F #).
Конечно, это вопрос о Java. Итак, я предлагаю принять библиотеку, которая привносит в Java функциональные возможности. Например, это можно решить с помощью моей собственной библиотеки следующим образом (и есть еще несколько других, на которые стоит обратить внимание):
источник
источник
источник
Это был бы хороший способ найти повторяющиеся значения без использования Set.
И скажите, что вам нужен метод, который возвращает вам отдельный список, т.е. если вы передадите список, в котором элементы встречаются более одного раза, вы получите список с отдельными элементами.
источник
И версия, в которой используется
commons-collections
CollectionUtils.getCardinalityMap
метод:`` `
источник
Как насчет этого кода -
источник
на всякий случай для тех, кто также хочет включить как дубликаты, так и не дубликаты. в основном ответ похож на правильный ответ, но вместо возврата из части if вы возвращаете часть else
используйте этот код (измените на нужный вам тип)
источник
Более общий метод как вариант https://stackoverflow.com/a/52296246
источник
Если вы знаете максимальное значение (например, <10000), вы можете пожертвовать пространством ради скорости. Не могу вспомнить точное название этой техники.
псевдокод:
источник
Просто попробуйте это:
Пример значений списка: [1, 2, 3, 4, 5, 6, 4, 3, 7, 8] повторяющийся элемент [3, 4].
источник