Как преобразовать массив в набор в Java - PullRequest
643 голосов
/ 17 июня 2010

Я хотел бы преобразовать массив в набор в Java.Есть несколько очевидных способов сделать это (то есть с помощью цикла), но я хотел бы что-то более аккуратное, что-то вроде:

java.util.Arrays.asList(Object[] a);

Есть идеи?

Ответы [ 17 ]

1138 голосов
/ 17 июня 2010

Например:

Set<T> mySet = new HashSet<>(Arrays.asList(someArray));

В Java 9+, если не изменяемый набор в порядке:

Set<T> mySet = Set.of(someArray);

В Java 10+, параметр универсального типа может быть выведен из массивовтип компонента:

var mySet = Set.of(someArray);
205 голосов
/ 17 июня 2010
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);

Это Collections.addAll (java.util.Collection, T ...) из JDK 6.

Дополнительно: что если наш массив полон примитивов?

Для JDK <8, я бы просто написал очевидный цикл <code>for, чтобы выполнить обтекание и добавление-набор за один проход.

Для JDK> = 8 привлекательный вариант выглядит примерно так:

Arrays.stream(intArray).boxed().collect(Collectors.toSet());
119 голосов
/ 17 июня 2010

С Гуава вы можете сделать:

T[] array = ...
Set<T> set = Sets.newHashSet(array);
63 голосов
/ 02 февраля 2015

Java 8:

String[] strArray = {"eins", "zwei", "drei", "vier"};

Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());
System.out.println(strSet);
// [eins, vier, zwei, drei]
41 голосов
/ 16 сентября 2015

Varargs тоже будет работать!

Stream.of(T... values).collect(Collectors.toSet());
25 голосов
/ 24 июня 2015

Java 8

У нас также есть возможность использовать Stream. Мы можем получить поток различными способами:

Set<String> set = Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
System.out.println(set);

String[] stringArray = {"A", "B", "C", "D"};
Set<String> strSet1 = Arrays.stream(stringArray).collect(Collectors.toSet());
System.out.println(strSet1);

// if you need HashSet then use below option.
Set<String> strSet2 = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
System.out.println(strSet2);

Исходный код Collectors.toSet() показывает, что элементы добавляются один за другим в HashSet, но спецификация не гарантирует, что это будет HashSet.

"Нет никаких гарантий относительно типа, изменчивости, сериализуемости или Потокобезопасность набора возвращена. "

Так что лучше использовать более позднюю опцию. Выход: [A, B, C, D] [A, B, C, D] [A, B, C, D]

Неизменный набор (Java 9)

Java 9 представил Set.of статический метод фабрики, который возвращает неизменяемый набор для предоставленных элементов или массива.

@SafeVarargs
static <E> Set<E> of​(E... elements)

Проверьте Неизменяемый набор статических заводских методов для получения подробной информации.

Неизменный набор (Java 10)

Мы также можем получить неизменный набор двумя способами:

  1. Set.copyOf(Arrays.asList(array))
  2. Arrays.stream(array).collect(Collectors.toUnmodifiableList());

В методе Collectors.toUnmodifiableList() внутренне используется Set.of, представленный в Java 9. Также проверьте этот ответ для получения дополнительной информации.

18 голосов
/ 17 июня 2010

После того как вы выполните Arrays.asList(array), вы можете выполнить Set set = new HashSet(list);

Вот пример метода, вы можете написать:

public <T> Set<T> GetSetFromArray(T[] array) {
    return new HashSet<T>(Arrays.asList(array));
}
10 голосов
/ 19 декабря 2012

В Коллекции Eclipse , будет работать следующее:

Set<Integer> set1 = Sets.mutable.of(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.mutable.of(new Integer[]{1, 2, 3, 4, 5});
MutableSet<Integer> mutableSet = Sets.mutable.of(1, 2, 3, 4, 5);
ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3, 4, 5);

Set<Integer> unmodifiableSet = Sets.mutable.of(1, 2, 3, 4, 5).asUnmodifiable();
Set<Integer> synchronizedSet = Sets.mutable.of(1, 2, 3, 4, 5).asSynchronized();
ImmutableSet<Integer> immutableSet = Sets.mutable.of(1, 2, 3, 4, 5).toImmutable();

Примечание: я являюсь коммиттером для Eclipse Collections

6 голосов
/ 04 ноября 2011

Быстро: вы можете сделать:

// Fixed-size list
List list = Arrays.asList(array);

// Growable list
list = new LinkedList(Arrays.asList(array));

// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));

и наоборот

// Create an array containing the elements in a list
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);

// Create an array containing the elements in a set
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);
5 голосов
/ 29 апреля 2016

Я написал ниже из приведенного выше совета - укради это ... это хорошо!

/**
 * Handy conversion to set
 */
public class SetUtil {
    /**
     * Convert some items to a set
     * @param items items
     * @param <T> works on any type
     * @return a hash set of the input items
     */
    public static <T> Set<T> asSet(T ... items) {
        return Stream.of(items).collect(Collectors.toSet());
    }
}
...