Kaip konvertuoti masyvą į java rinkinį

Norėčiau konvertuoti masyvą į Nustatyti „Java“. Yra keletas akivaizdžių būdų tai padaryti (t.y. su kilpa), bet norėčiau, kad kažkas šiek tiek tidier, kažkas panašaus:

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

Bet kokios idėjos?

599
17 июня '10 в 21:23 2010-06-17 21:23 user130076 nustatytas birželio 17 d., 10 val. 21:23 2010-06-17 21:23
@ 18 atsakymų

Patinka tai:

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

„Java 9+“, jei nepakeista kolekcija yra tokia:

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

„Java 10+“ bendrojo tipo parametras gali būti nustatomas pagal masyvo komponento tipą:

 var mySet = Set.of(someArray); 
1063
17 июня '10 в 21:27 2010-06-17 21:27 atsakymas pateikiamas SLaksas birželio 17 d. 10 val. 21:27 2010-06-17 21:27
 Set<T> mySet = new HashSet<T>(); Collections.addAll(mySet, myArray); 

Tai yra JDK 6 kolekcijos.addAll (java.util.Collection, T ...) .

Neprivaloma: ką daryti, jei mūsų masyvas yra pilnas primityvių?

border=0

JDK <8, aš tiesiog parašyčiau aiškią kilpą, kad persiųčiau ir papildytumėte rinkinį viename leidime.

JDK> = 8, patraukli parinktis yra tokia:

 Arrays.stream(intArray).boxed().collect(Collectors.toSet()); 
191
17 июня '10 в 21:37 2010-06-17 21:37 atsakymą pateikė JavadocMD birželio 17 d. 10 val. 21:37 2010-06-17 21:37

Su Guava galite padaryti:

 T[] array = ... Set<T> set = Sets.newHashSet(array); 
117
17 июня '10 в 21:36 2010-06-17 21:36 atsakymas pateikiamas ColinD birželio 17 d. 10 val. 21:36 2010-06-17 21:36

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] 
60
02 февр. atsakymas pateikiamas maks. 02 vasario mėn. 2015-02-02 19:03 '15, 19:03, 2015-02-02 19:03

Vargar taip pat dirbs!

 Stream.of(T... values).collect(Collectors.toSet()); 
39
16 сент. atsakymas Alexui 16 sep. 2015-09-16 10:44 '15 , 10:44 2015-09-16 10:44

Java 8

Mes taip pat turime galimybę naudoti „ Stream . Mes galime gauti srautą įvairiais būdais:

 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() šaltinio kodas rodo, kad elementai yra papildomi vienas prie „ HashSet tačiau specifikacija negarantuoja, kad jis bus „ HashSet .

"Nėra jokių garantijų dėl grįžtamojo ryšio sriegių tipo, kintamumo, serializavimo ar saugumo."

Taigi geriau naudoti vėlesnę versiją. Išvada: [A, B, C, D] [A, B, C, D] [A, B, C, D]

Fiksuotas rinkinys (java 9)

„Java 9“ pristatė „ Set.of statinį gamyklos metodą, kuris grąžina Set.of komplektuojamų elementų arba masyvo rinkinį.

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

Išsamesnės informacijos ieškokite skyriuje „Statiniai nuolatinio rinkimo metodai“ .

Fiksuotas rinkinys (java 10)

Taip pat galime gauti fiksuotą rinkinį dviem būdais:

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

Collectors.toUnmodifiableList() metodas viduje naudoja „ Set.of pateiktą „Java 9“. Taip pat patikrinkite šį mano atsakymą, jei norite gauti daugiau informacijos.

22
24 июня '15 в 8:38 2015-06-24 08:38 atsakymas pateikiamas i_am_zero birželio 24 d., 15 val. 8:38 2015-06-24 08:38

Paleidus „ Arrays.asList(array) galite paleisti „ Set set = new HashSet(list);

Čia pateikiamas metodo, kurį galite rašyti, pavyzdys:

 public <T> Set<T> GetSetFromArray(T[] array) { return new HashSet<T>(Arrays.asList(array)); } 
18
17 июня '10 в 21:27 2010-06-17 21:27 atsakymas pateikiamas Petar Minchev birželio 17 d. 10 val. 21:27 2010-06-17 21:27

Eclipse“ kolekcijose veiks šie veiksmai:

 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(); 

Pastaba: esu „Eclipse“ kolekcijų pasiuntinys

10
19 дек. Donaldas Raabas atsakė gruodžio 19 d. 2012-12-19 02:04 '12, 02:04 2012-12-19 02:04

Greitai: galite:

 // 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)); 

ir atšaukti

 // 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()]); 
6
04 нояб. atsakymą pateikė Pierre-Olivier Pignon . 2011-11-04 12:30 '11, 12:30, 2011-11-04 12:30

Aš parašiau žemiau iš aukščiau pateikto patarimo - pavogti jį ... malonu!

  public class SetUtil {  public static <T> Set<T> asSet(T ... items) { return Stream.of(items).collect(Collectors.toSet()); } } 
5
29 апр. Ashley Frieze atsakymas, pateiktas balandžio 29 d 2016-04-29 01:10 '16 at 1:10 2016-04-29 01:10

Jau buvo daug gerų atsakymų, tačiau dauguma jų neveiks su daugybe primityvių elementų, tokių kaip ( int[] , byte[] , long[] , char[] ir tt)

„Java“ 8 ir naujesnėse versijose įdėkite kažką panašaus į masyvą:

 Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new); 

Tada paprastas srautas gali konvertuoti jį į rinkinį:

 Stream.of(boxedArr).collect(Collectors.toSet()); 
1
17 дек. Julija atsakė gruodžio 17 d. 2018-12-17 04:08 '18, 04:08 2018-12-17 04:08

Naudokite „ CollectionUtils arba „ ArrayUtilsstanford-postagger-3.0.jar

 import static edu.stanford.nlp.util.ArrayUtils.asSet; or import static edu.stanford.nlp.util.CollectionUtils.asSet; ... String [] array = {"1", "q"}; Set<String> trackIds = asSet(array); 
0
22 мая '18 в 0:26 2018-05-22 00:26 atsakymas suteikiamas Olexandra Dmytrenko gegužės 22 d., 18 val. 0:26 2018-05-22 00:26

Java 10“ :

 String[] strs = {"A", "B"}; Set<String> set = Set.copyOf(Arrays.asList(strs)); 

Set.copyOf grąžina nekintamą Set kuriame yra šio Collection elementai.

Ši Collection neturi būti null ir joje negali būti jokių elementų.

0
14 апр. Atsakymas pateikiamas Oleksandr 14 balandžio. 2018-04-14 23:59 '18, 23:59 val. 23:59
  private Map<Integer, Set<Integer>> nobreaks = new HashMap(); nobreaks.put(1, new HashSet(Arrays.asList(new int[]{2, 4, 5}))); System.out.println("expected size is 3: " +nobreaks.get(1).size()); 

išvada

  expected size is 3: 1 

pakeisti jį į

  nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 ))); 

išvada

  expected size is 3: 3 
0
28 авг. atsakymas pateikiamas Bruce Zu 28 rug. 2016-08-28 23:34 '16 at 11:34 pm 2016-08-28 23:34

Kartais padeda naudoti kai kurias standartines bibliotekas. Pabandykite pamatyti „Apache“ bendruomenės rinkinius . Tokiu atveju jūsų problemos tiesiog paverčiamos kažkuo panašiu.

 String[] keys = {"blah", "blahblah"} Set<String> myEmptySet = new HashSet<String>(); CollectionUtils.addAll(pythonKeywordSet, keys); 

Ir čia yra kolekcijosUtils javadoc

0
04 янв. atsakymas pateikiamas mnagni 04 sausis 2012-01-04 20:13 '12, 08:13 PM 2012-01-04 20:13

new HashSet<Object>(Arrays.asList(Object[] a));

Bet manau, kad būtų veiksmingiau:

 final Set s = new HashSet<Object>(); for (Object o : a) { s.add(o); } 
-2
17 июня '10 в 21:28 2010-06-17 21:28 Atsakymą pateikė Ben S , birželio 17 d., 10:21, 2010-06-17 21:28
 Set<String> set = org.mapstruct.ap.internal.util.Collections.asSet("one", "two"); 
-2
01 авг. atsakymas duotas oleg.cherednik 01 rug . 2017-08-01 18:18 '17 at 18:18 2017-08-01 18:18
 Set<T> b = new HashSet<>(Arrays.asList(requiredArray)); 
-4
12 янв. atsakymą pateikė Satyendra Jaiswal 12 sausis 2016-01-12 15:20 '16 at 15:20 2016-01-12 15:20

Kiti klausimai apie „ arba „ Užduoti klausimą“