Yanıtlar:
Sepp2k ile hemfikirim, ancak önemli olabilecek bazı detaylar var:
new HashSet<Foo>(myList);
size yinelemeleri olmayan sıralanmamış bir küme verecektir. Bu durumda, çoğaltma, nesnelerinizdeki .equals () yöntemi kullanılarak tanımlanır. Bu, .hashCode () yöntemiyle birlikte yapılır. (Eşitlik hakkında daha fazla bilgi için buraya bakın )
Sıralı küme veren bir alternatif:
new TreeSet<Foo>(myList);
Foo Karşılaştırılabilir'i uygularsa bu işe yarar. Yoksa, bir karşılaştırıcı kullanmak isteyebilirsiniz:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
Bu, benzersizliği sağlamak için CompareTo () (karşılaştırılabilir arabirimden) veya Compare () (karşılaştırıcıdan) değerlerine bağlıdır. Yani, sadece benzersizliği önemsiyorsanız, HashSet'i kullanın. Sıralamadan sonra iseniz, TreeSet'i düşünün. (Unutmayın: Daha sonra optimize edin!) Zaman verimliliği önemliyse, alan verimliliği önemliyse bir HashSet kullanın, TreeSet'e bakın. Set ve Map'in daha verimli uygulamalarının Trove (ve diğer yerler) aracılığıyla sağlandığını unutmayın.
Eğer kullanırsanız Guava kütüphanesi:
Set<Foo> set = Sets.newHashSet(list);
ya da daha iyisi:
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of(), örneğin olduğu gibi. EDIT: tüm aşırı yükler gereksiz olduğundan faktör olmayabilir .
Java 8'i kullanarak akışı kullanabilirsiniz:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Set<E> alphaSet = new HashSet<E>(<your List>);
veya tam örnek
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);
}
}
}
Sete dönüştürmeden önce bir Null kontrolü yapardım.
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Sen dönüştürebilirsiniz List<>içinSet<>
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);
}
Java 8 için çok kolay:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>();-) kullanmak olurdu
Java - addAll
set.addAll(aList);
Java - yeni Nesne
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
Guva Kullanımı
Sets.newHashSet(list)
Apache Commons
CollectionUtils.addAll(targetSet, sourceList);
Java 10
var set = Set.copyOf(list);
Yapıcıyı kullanmanın en iyi yolu
Set s= new HashSet(list);
Java 8'de aynı zamanda stream api ::
Set s= list.stream().collect(Collectors.toSet());
SetAs almanın çeşitli yolları vardır :
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);
Kullandığımız zaman Collectors.toSet()bir dizi döner ve doc göre: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. Eğer bir tane almak istiyorsak, HashSetbir set (kontrol set3) almak için diğer alternatifi kullanabiliriz .
Java 10 ile artık a'yı değiştirilemez Set#copyOfhale kolayca dönüştürmek için List<E>kullanabilirsiniz Set<E>:
Misal:
var set = Set.copyOf(list);
Bu bir sırasız işlemdir ve unutmayın nullelemanları vardır değil bir atacağım olarak, izin verilen NullPointerException.
Değiştirilebilir olmasını istiyorsanız, bunu yapıcıya bir Setuygulama olarak iletin.
İle daha fazla Java 8 esnek çözümü Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
Eğer kullanırsanız Eclipse Koleksiyon :
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
MutableSetArayüzü uzanır java.util.Setise MutableIntSetarayüz değildir. Ayrıca herhangi Iterablebirini fabrika sınıfını Setkullanarak bir dönüştürebilirsiniz Sets.
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
Eclipse Koleksiyonlarında bulunan değiştirilebilir fabrikalar hakkında daha fazla açıklama var .
Bir istiyorsan ImmutableSetbir gelen Listkullanabileceğiniz Setsaşağıdaki gibi fabrika:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
Not: Eclipse Collections için bir komisyoncuyum
Liste yinelemeleri kaldırdığından, Liste yinelemeleri desteklediğinden, ancak Set Java'daki yinelemeleri desteklemediğinden, Listeden Set'e dönüştürmenin koleksiyondaki yinelemeleri kaldıracağını unutmayın.
Doğrudan Dönüşüm: Bir Listeyi Kümeye dönüştürmenin en yaygın ve basit yolu
// 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 Koleksiyonları: Bir Listeyi Kümeye dönüştürmek için Commons Koleksiyonları API'sını da kullanabilirsiniz: -
// 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);
Akış kullanma: Başka bir yol, verilen listeyi akışa dönüştürmek, ardından ayarlamak için akış yapmaktır:
// 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());
SetveMapbir uygulamanın kullandığı; buradaHashSetolduğu varsayılır .