Jaki jest najłatwiejszy sposób przekonwertowania pliku List
na Set
w języku Java?Najprostszy sposób konwertowania listy do zestawu w języku Java
Odpowiedz
Set<Foo> foo = new HashSet<Foo>(myList);
zgadzam się z sepp2k, ale istnieje kilka innych szczegółów, które mogłyby Dziedzina:
new HashSet<Foo>(myList);
daje niesegregowanych zestaw, który nie ma duplikatów. W tym przypadku duplikacja jest identyfikowana za pomocą metody .equals() na twoich obiektach. Odbywa się to w połączeniu z metodą .hashCode(). (Więcej informacji na temat równości wyglądać here)
Alternatywą, która daje posortowaną zestawu wynosi:
new TreeSet<Foo>(myList);
Działa to czy Foo implementuje porównywalne. Jeśli nie wtedy może chcieć użyć komparatora:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
to zależy od obu CompareTo() (z porównywalnym Interface) lub porównać() (od komparatora), aby zapewnić niepowtarzalność. Jeśli więc zależy Ci tylko na wyjątkowości, użyj HashSet. Jeśli chcesz sortować, weź pod uwagę TreeSet. (Pamiętaj: Optymalizuj później!) Jeśli liczy się efektywność czasu, użyj HashSet, jeśli ważna jest wydajność miejsca, spójrz na TreeSet. Zauważ, że wydajniejsze implementacje Set i Map są dostępne przez Trove (i inne lokalizacje).
Jeśli używasz Guava Biblioteka:
Set<Foo> set = Sets.newHashSet(list);
albo lepiej:
Set<Foo> set = ImmutableSet.copyOf(list);
+1 za użycie ImmutableSet – tomrozb
Dlaczego ImmutableSet.copyOf jest lepszy? – user672009
Jakie zalety ma newHashSet() Guavy nad podstawową java new HashSet()? –
Set<E> alphaSet = new HashSet<E>(<your List>);
lub kompletny przykład
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListToSet
{
public static void main(String[] args)
{
List<String> alphaList = new ArrayList<String>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("A");
alphaList.add("B");
System.out.println("List values .....");
for (String alpha : alphaList)
{
System.out.println(alpha);
}
Set<String> alphaSet = new HashSet<String>(alphaList);
System.out.println("\nSet values .....");
for (String alpha : alphaSet)
{
System.out.println(alpha);
}
}
}
+1 dla pełnego przykładu kodu. Jedną dodatkową uwagą jest to, że nie ma gwarancji, że hashing będzie taki sam, od uruchomienia do uruchomienia. Oznacza to, że lista wydrukowana po "Ustaw wartościach ....." może być "ABC" jeden bieg, a "CBA" kolejny bieg. Jak wspomniałem w mojej odpowiedzi, można użyć zestawu drzew, aby uzyskać stabilne zamówienie. Inną opcją byłoby użycie obiektu LinkedHashSet, który zapamiętuje kolejność dodawania elementów do niego. – Spina
chciałbym wykonać Null czek przed konwersją ustawić .
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Lub 'Set
Można konwertować List<>
do Set<>
Set<T> set=new HashSet<T>();
//Added dependency -> If list is null then it will throw NullPointerExcetion.
Set<T> set;
if(list != null){
set = new HashSet<T>(list);
}
Myślę, że chodziło Ci o przeniesienie go z List do Set. – Simon
Korzystanie Java 8 można użyć strumienia:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Czy sprawdziłeś na tym kary? to zrobiłby iteracyjny + iterator, nowy HashSet(), a następnie dla każdego elementu listy, wywołanie addAll() w nowym zestawie. Ogólnie rzecz biorąc, cca. 5 obiektów utworzonych dla czegoś tak prostego jak nowy HashSet (lista). –
Istnieją różne sposoby, aby uzyskać Set
jak:
List<Integer> sourceList = new ArrayList();
sourceList.add(1);
sourceList.add(2);
sourceList.add(3);
sourceList.add(4);
// Using Core Java
Set<Integer> set1 = new HashSet<>(sourceList); //needs null-check if sourceList can be null.
// Java 8
Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));
//Guava
Set<Integer> set4 = Sets.newHashSet(sourceList);
// Apache commons
Set<Integer> set5 = new HashSet<>(4);
CollectionUtils.addAll(set5, sourceList);
Kiedy używamy Collectors.toSet()
, zwraca zestaw i zgodnie z dokumentem: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Jeśli chcemy uzyskać HashSet
, możemy użyć innej alternatywy, aby uzyskać zestaw (sprawdź set3
).
Dla Java 8 to bardzo proste:
List <UserEntity> vList= new ArrayList<UserEntity>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
Nie zapominajmy naszego stosunkowo nowego przyjaciela, java-8 strumienia API. Jeśli potrzebujesz listy Preprocesuj przed przekształceniem go do zestawu, to lepiej mieć coś takiego:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
Bardziej Java 8 sprężysta rozwiązanie z Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Z Java 10, można teraz używać Set#copyOf
łatwo przekształcić List<E>
do niezmienne Set<E>
:
przykład:
var set = Set.copyOf(list);
Należy pamiętać, że ta operacja jest nieuporządkowana i null
elementy są nie dozwolone, ponieważ będzie ona rzucać NullPointerException
.
Jeśli chcesz, aby można było go modyfikować, po prostu prześlij go do konstruktora implementacji Set
.
- 1. Jaki jest najprostszy sposób konwertowania listy z str na listę z int?
- 2. Lepszy sposób konwertowania listy na wektor?
- 3. Filtrowanie elementów z zestawu w języku Java
- 4. Scala, konwertowania wielu list do listy krotek
- 5. Tworzenie podzbioru zestawu w języku Java
- 6. Najprostszy sposób prawidłowego załadowania html ze strony internetowej do napisu w języku Java
- 7. Równoważnik zestawu drzewiastego w języku Java do języka C# .net
- 8. Sortowanie połączonej listy w języku Java
- 9. Dołącz elementy zestawu do listy w Pythonie
- 10. Najlepszy sposób konwertowania list na ciąg rozdzielany przecinkami w java
- 11. Pythoniczny sposób konwertowania listy dyktowanych na listę literowanych kostek
- 12. Java: Jak przekonwertować ciąg [] do listy lub zestawu
- 13. Najprostszy sposób do kwerendy XML w Javie
- 14. Jak utworzyć plik scala.collection.immutable.Seq z listy Java w języku Java?
- 15. Najprostszy sposób na zbudowanie drzewa z listy przodków
- 16. Java: Najprostszy sposób na uzyskanie ostatniego słowa w ciągu znaków
- 17. W języku C#, czy istnieje sposób konwertowania tablicy do stosu <T> bez pętli?
- 18. Kodowanie Base64 w języku Java/Groovy
- 19. Bezpieczny sposób konwertowania liczby całkowitej w enum
- 20. najlepszym podejściem do konwertowania Boolean ciąg w java
- 21. Najprostszy sposób na zapisanie NSData do pliku
- 22. Najprostszy sposób sprawdzania numerów
- 23. Przekazywanie listy w języku Python do php
- 24. Najprostszy sposób na kopiowanie int do bajtu []
- 25. Zapisywanie zestawu bitów do pliku w java
- 26. Jaki jest najprostszy sposób uzyskania dostępu do mikrofonu z komputera w języku Python?
- 27. Najprostszy sposób na utworzenie strumienia z obiektu Java?
- 28. Jaki jest najprostszy sposób wykonania klasy Java co 30 sekund?
- 29. Najprostszy sposób na pobranie pliku?
- 30. Odpowiednik Java w języku Python "w" - do ustawienia testu członkostwa?
Spowoduje to wygenerowanie wyjątku NullPointerException, jeśli lista będzie pusta. – Ashish
@Ashish: To nie ma znaczenia dla pytania. Nikt nie pytał, jak przekonwertować null na Set. Ludzie zawsze wymagający obsługi null to znak, jak złamana jest Java (kultura). Prawie zawsze null jest błędem. WYRÓŻNIENIE WYJĄTKU JEST RZECZYWIŚCIE NAJLEPSZE, KTÓREGO MOŻESZ ZROBIĆ. Zwłaszcza gdy jest to zerowe odniesienie do kolekcji: jak często można sobie wyobrazić semantyczne znaczenie odwołań zerowych do kolekcji - i takie, że znaczenie różni się od pustej kolekcji? –
Uzgodnione, zamiast wartości NULL, należy (prawie) zawsze przekazywać: niezmienne statyczne, puste wystąpienia twoich ziaren, lub Collections.emptyXXX() dla twoich kolekcji. Dzięki temu Twój kod jest dużo łatwiejszy do odczytania, jeśli nie jest zanieczyszczony zerowymi kontrolami na początku każdej metody. –