gemakkelijkste manier om een ​​lijst naar een set in Java

Wat is de eenvoudigste manier om een ​​Listnaar een Setin 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 Sette 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 HashSetwillen krijgen, kunnen we het andere alternatief gebruiken om een set te krijgen (vink set3aan).


Antwoord 12

Met Java 10 kunt u nu Set#copyOfom 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 NullPointerExceptionwordt 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.Setuit, terwijl de MutableIntSet-interface dat niet doet. Je kunt ook elke Iterableconverteren naar een Setmet 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 ImmutableSetuit een Listwilt, 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()); 

Other episodes