Я хотел бы преобразовать массив в набор в Java. Есть несколько очевидных способов сделать это (то есть с помощью цикла), но я хотел бы что-то более аккуратное, что-то вроде:
java.util.Arrays.asList(Object[] a);
Любые идеи?
java
collections
arrays
set
Боб Гилмор
источник
источник
Arrays.asList
является O (1).Это Collections.addAll (java.util.Collection, T ...) из JDK 6.
Дополнительно: что если наш массив полон примитивов?
Для JDK <8, я бы просто написал очевидный
for
цикл, чтобы сделать перенос и добавление-набор за один проход.Для JDK> = 8 привлекательный вариант выглядит примерно так:
источник
java.util.Collections.addAll
. Кроме того, я бы больше не рекомендовал Commons Collections, поскольку он не генерируется и Guava не существует.addAll
будет O ( N ).С Guava вы можете сделать:
источник
new HashSet<T>(Arrays.asList(someArray))
. См. Google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
источник
Varargs тоже будет работать!
источник
Java 8
У нас также есть возможность использования
Stream
. Мы можем получить поток различными способами:Исходный код
Collectors.toSet()
показывает, что элементы добавляются один за другим,HashSet
но спецификация не гарантирует, что это будетHashSet
.Так что лучше использовать более поздний вариант. Выход:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Неизменный набор (Java 9)
Java 9 представил
Set.of
статический метод фабрики, который возвращает неизменный набор для предоставленных элементов или массива.Проверьте непреложный Набор статических фабричные методы для деталей.
Неизменный набор (Java 10)
Мы также можем получить неизменный набор двумя способами:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
Метод
Collectors.toUnmodifiableList()
внутренне используетSet.of
введенный в Java 9. Также проверьте мой ответ для большего.источник
Stream.of()
- я этого не знал. Небольшое возражениеCollectors.toSet()
: вы говорите, что спецификация не гарантирует добавление элементов один за другим, но именно это означает: «накапливается ... в новомSet
». И это более читабельно - на мой взгляд, предпочтительнее, если вам не нужны гарантии конкретного типа, изменчивости, сериализуемости и безопасности потоков.HashSet
. Это только гарантирует, что это будет,Set
и это то, что я имею в виду. Надеюсь, я прояснил это.После того как
Arrays.asList(array)
вы можете выполнитьSet set = new HashSet(list);
Вот пример метода, который вы можете написать:
источник
В Eclipse Collections будет работать следующее:
Примечание: я являюсь коммиттером для коллекций Eclipse
источник
Быстро: вы можете сделать:
и повернуть вспять
источник
Я написал ниже из совета выше - укради это ... это приятно!
источник
Там было много хороших ответов уже, но большинство из них не будет работать с массивом примитивов (например
int[]
,long[]
,char[]
,byte[]
и т.д.)В Java 8 и выше, вы можете связать массив с:
Затем преобразуйте в набор, используя поток:
источник
Иногда помогает использование некоторых стандартных библиотек. Попробуйте взглянуть на коллекции Apache Commons . В этом случае ваши проблемы просто трансформируются в нечто подобное
А вот и коллекция CollectionsUtils Javadoc
источник
java.util.Collections.addAll(myEmptySet, keys);
??Использовать
CollectionUtils
илиArrayUtils
изstanford-postagger-3.0.jar
источник
В Java 10 :
Set.copyOf
возвращает неизменяемое,Set
содержащее элементы данногоCollection
.Данное
Collection
не должно бытьnull
, и оно не должно содержать каких - либоnull
элементов.источник
выход
изменить на
выход
источник
Для тех, кто решает для Android:
Kotlin Collections Solution
Звездочка
*
являетсяspread
оператором. Он применяет все элементы в коллекции по отдельности, каждый из которых передается в порядкеvararg
параметра метода. Это эквивалентно:Передача без параметров
setOf()
приводит к пустому набору.В дополнение к этому
setOf
вы также можете использовать любой из них для определенного типа хеша:Вот как явно определить тип элемента коллекции.
источник
new HashSet<Object>(Arrays.asList(Object[] a));
Но я думаю, что это будет более эффективным:
источник
HashSet
задается на основе размера массива.источник