Как преобразовать массив в множество в Java
Проблема: Я хотел бы преобразовать массив в Set на Java. Есть очевидные способы сделать это (например, с помощью цикла), но я ищу что-то более элегантное, например, что-то похожее на:
java.util.Arrays.asList(Object[] a);
Есть идеи?
5 ответ(ов)
Вы можете преобразовать массив строк в множество в 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]
В этом коде мы сначала создаем массив строк strArray
, затем преобразуем его в поток с помощью Arrays.stream()
. Далее мы собираем элементы потока в коллекцию типа Set
с использованием метода collect()
и Collectors.toSet()
. Обратите внимание, что множество не гарантирует порядок элементов, поэтому при выводе на экран порядок может варьироваться.
Да, вы можете использовать varargs для создания стрима. Вот пример кода на Java, который делает именно это:
Set<T> resultSet = Stream.of(values).collect(Collectors.toSet());
Где values
— это ваши переменные, переданные в качестве varargs. Не забудьте заменить T
на нужный вам тип. Таким образом, вы сможете собрать элементы в Set
без каких-либо проблем.
После того, как вы выполните Arrays.asList(array)
, вы можете создать Set
, используя new HashSet(list)
.
Вот пример метода, который вы можете написать:
public <T> Set<T> getSetFromArray(T[] array) {
return new HashSet<T>(Arrays.asList(array));
}
Этот метод принимает массив типа T
, преобразует его в список через Arrays.asList(array)
, а затем создает и возвращает HashSet
, который автоматически уберет дубликаты.
На данный момент уже было представлено множество отличных ответов, но большинство из них не работают с массивами примитивов (такими как int[]
, long[]
, char[]
, byte[]
и т.д.).
В Java 8 и выше вы можете выполнить упаковку массива с помощью:
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Затем можно преобразовать его в Set
, используя стрим:
Set<Integer> resultSet = Stream.of(boxedArr).collect(Collectors.toSet());
Таким образом, вы сможете создать Set
из массива примитивов, предварительно упаковав его в массив объектов.
Быстро: вы можете сделать следующее:
// Статический список
List list = Arrays.asList(array);
// Растягиваемый список
list = new LinkedList(Arrays.asList(array));
// Дубликаты элементов отбрасываются
Set set = new HashSet(Arrays.asList(array));
Для обращения списка:
// Создать массив, содержащий элементы списка
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);
// Создать массив, содержащий элементы множества
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);
Не забудьте обработать предупреждения о приведении типов, если вы используете дженерики.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как преобразовать int[] в List<Integer> в Java?
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?