Wat is de eenvoudigste manier om een List
naar een Set
in Java te converteren?
1, Autoriteit 100%
Set<Foo> foo = new HashSet<Foo>(myList);
2, Autoriteit 13%
Ik ben het eens met Sepp2k, maar er zijn enkele andere details die ertoe doen:
new HashSet<Foo>(myList);
geeft u een ongesorteerde set die geen duplicaten heeft. In dit geval wordt duplicatie geïdentificeerd met behulp van de .equips () methode op uw objecten. Dit gebeurt in combinatie met de .hashcode () -methode. (Voor meer op gelijkheidslook hier )
Een alternatief dat een gesorteerde set geeft is:
new TreeSet<Foo>(myList);
Dit werkt als foo computes vergelijkbaar is. Als het niet dan niet meer wilt gebruiken een comparator:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Dit hangt af van het vergelijken van vergelijking () (uit de vergelijkbare interface) of vergelijk () (van de comparator) om uniciteit te waarborgen. Dus, als je gewoon om uniciteit geeft, gebruik dan de hashset. Als u na het sorteren bent, overweeg dan de bomen. (Vergeet niet: op te optimaliseren!) Als de tijdsefficiëntie aangelegenheden een hashset gebruiken als ruimte-efficiëntie is, kijk dan naar Treeset. Merk op dat efficiëntere implementaties van set en kaart beschikbaar zijn via Trove (en andere locaties).
3, Autoriteit 6%
Als u de Guava bibliotheek:
Set<Foo> set = Sets.newHashSet(list);
of, beter:
Set<Foo> set = ImmutableSet.copyOf(list);
4, Autoriteit 3%
Java 8 gebruiken U kunt stream gebruiken:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
5
Set<E> alphaSet = new HashSet<E>(<your List>);
of voltooi voorbeeld
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);
}
}
}
Antwoord 6
Ik zou een Null-controle uitvoeren voordat ik naar set converteer.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Antwoord 7
U kunt List<>
converteren naar 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);
}
Antwoord 8
Voor Java 8 is het heel eenvoudig:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
Antwoord 9
Laten we onze relatief nieuwe vriend, niet vergeten java-8stream-API.
Als u de lijst moet voorbewerken voordat u deze naar een set converteert, is het beter om zoiets te hebben als:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
Antwoord 10
De beste manier om constructor te gebruiken
Set s= new HashSet(list);
In java 8 kun je ook stream api gebruiken::
Set s= list.stream().collect(Collectors.toSet());
Antwoord 11
Er zijn verschillende manieren om een Set
te krijgen als:
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);
Wanneer we Collectors.toSet()
gebruiken, retourneert het een set en volgens het document:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Als we een HashSet
willen krijgen, kunnen we het andere alternatief gebruiken om een set te krijgen (vink set3
aan).
Antwoord 12
Met Java 10 kunt u nu Set#copyOf
om eenvoudig een List<E>
te converteren naar een niet-wijzigbare Set<E>
:
Voorbeeld:
var set = Set.copyOf(list);
Houd er rekening mee dat dit een ongeordende bewerking is en dat null
-elementen nietzijn toegestaan, omdat er een NullPointerException
wordt gegenereerd.
Als je wilt dat het aanpasbaar is, geef het dan gewoon een Set
-implementatie door aan de constructor.
Antwoord 13
Een meer veerkrachtige Java 8-oplossing met Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Antwoord 14
Als je Eclipse Collectionsgebruikt:
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
De MutableSet
-interface breidt java.util.Set
uit, terwijl de MutableIntSet
-interface dat niet doet. Je kunt ook elke Iterable
converteren naar een Set
met behulp van de Sets
-fabrieksklasse.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Er is meer uitleg over de veranderlijke fabrieken die beschikbaar zijn in Eclipse Collections hier.
Als u een ImmutableSet
uit een List
wilt, kunt u de Sets
-fabriek als volgt gebruiken:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
Opmerking: ik ben een toegewijde voor Eclipse Collections
Antwoord 15
Houd er rekening mee dat bij het converteren van List naar Set duplicaten uit de verzameling worden verwijderd, omdat List duplicaten ondersteunt, maar Set ondersteunt geen duplicaten in Java.
Directe conversie:de meest gebruikelijke en eenvoudige manier om een lijst naar een set te converteren
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting a list to set
Set<String> set = new HashSet<>(list);
Apache Commons Collections:U kunt ook de Commons Collections API gebruiken om een lijst naar een set te converteren:-
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Creating a set with the same number of members in the list
Set<String> set = new HashSet<>(4);
// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);
Stream gebruiken:Een andere manier is om de gegeven lijst te converteren naar stream en vervolgens te streamen naar set:-
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting to set using stream
Set<String> set = list.stream().collect(Collectors.toSet());