Cara termudah untuk mengonversi Daftar ke Perangkat di Jawa


628

Apa cara termudah untuk mengonversi a Listke dalam Setdi Jawa?

Jawaban:


1065
Set<Foo> foo = new HashSet<Foo>(myList);

3
Meskipun benar, jawaban ini tidak memiliki konteks teknis yang memadai untuk menjamin menjadi jawaban terbaik / diterima, karena ada jebakan di sini tergantung pada implementasi Setdan Mapyang digunakan; HashSetadalah diasumsikan di sini.
Madbreak

145

Saya setuju dengan sepp2k, tetapi ada beberapa detail lain yang mungkin penting:

new HashSet<Foo>(myList);

akan memberi Anda set yang tidak disortir yang tidak memiliki duplikat. Dalam hal ini, duplikasi diidentifikasi menggunakan metode .equals () pada objek Anda. Ini dilakukan dalam kombinasi dengan metode .hashCode (). (Untuk lebih lanjut tentang kesetaraan, lihat di sini )

Alternatif yang memberikan set diurutkan adalah:

new TreeSet<Foo>(myList);

Ini berfungsi jika Foo mengimplementasikan Sebanding. Jika tidak maka Anda mungkin ingin menggunakan komparator:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

Ini tergantung pada compareTo () (dari antarmuka yang sebanding) atau bandingkan () (dari pembanding) untuk memastikan keunikan. Jadi, jika Anda hanya peduli tentang keunikan, gunakan HashSet. Jika Anda setelah menyortir, pertimbangkan TreeSet. (Ingat: Optimalkan nanti!) Jika efisiensi waktu penting gunakan HashSet jika efisiensi ruang penting, lihat TreeSet. Perhatikan bahwa implementasi Set dan Peta yang lebih efisien tersedia melalui Trove (dan lokasi lainnya).


Terima kasih telah memasukkan kasing pembanding khusus!
Justin Papez

70

Jika Anda menggunakan perpustakaan Guava :

Set<Foo> set = Sets.newHashSet(list);

atau lebih baik:

Set<Foo> set = ImmutableSet.copyOf(list);

2
Mengapa ImmutableSet.copyOf lebih baik?
user672009

1
Apa kelebihan yang dimiliki newHashSet () dari Guava dibandingkan dengan java baru HashSet ()?
Nelda.techspiress

@ Nelda.techspiress The javadoc dibahas ketika metode harus atau tidak boleh digunakan. Perhatikan bagian terakhir: metode ini tidak terlalu berguna dan kemungkinan akan usang di masa depan. Meskipun saya agak terkejut konsistensi tidak disebutkan sebagai faktor, seperti halnya dengan ImmutableSet.of(), misalnya. EDIT: itu mungkin bukan faktor karena semua kelebihan tidak perlu.
shmosel

1
Hai terima kasih untuk referensi @shmosel, tapi saya mencari lebih banyak untuk pengetahuan empiris. Bagi mereka yang telah menggunakan Jambu Biji, mengapa Jambu Biji akan dipilih lebih dari HashSet?
Nelda.techspiress

27

Menggunakan java 8 Anda dapat menggunakan streaming:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

10
Sudahkah Anda memeriksa penalti kinerja untuk ini? ini akan melakukan iterator + iterable, HashSet baru (), dan kemudian untuk setiap item daftar, panggilan addAll () pada set baru. Secara keseluruhan, cca. 5 objek dibuat untuk sesuatu yang sederhana seperti HashSet baru (daftar).
Agoston Horvath

1
@AgostonHorvath Terima kasih atas komentar Anda. Saya awalnya mencari informasi itu ketika saya datang ke sini.
TheRealChx101

17
Set<E> alphaSet  = new HashSet<E>(<your List>);

atau contoh lengkap

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
+1 untuk contoh kode lengkap. Satu catatan tambahan di sini adalah bahwa hashing tidak dijamin sama dari lari ke lari. Itu berarti bahwa daftar dicetak setelah 'Tetapkan nilai .....' mungkin 'ABC' satu kali jalan dan 'CBA' satu kali lagi. Seperti yang saya sebutkan dalam jawaban saya, Anda bisa menggunakan satu set pohon untuk mendapatkan pemesanan yang stabil. Opsi lain adalah menggunakan LinkedHashSet yang mengingat urutan item ditambahkan ke dalamnya.
Spina

8

Saya akan melakukan pemeriksaan Null sebelum mengubah ke set.

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

3
AtauSet<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
vegemite4me

6

Anda dapat mengonversi List<>keSet<>

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

Saya pikir Anda bermaksud melemparkannya dari List ke Set.
Simon

6

Untuk Java 8 sangat mudah:

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());

"Nyata" Java 8 akan digunakan new ArrayList<>();-)
JR

6

Java - addAll

set.addAll(aList);

Java - Obyek baru

new HashSet(list)

Java-8

list.stream().collect(Collectors.toSet());

Menggunakan Guva

 Sets.newHashSet(list)

Apache Commons

CollectionUtils.addAll(targetSet, sourceList);

Java 10

var set = Set.copyOf(list);

5

Jangan lupa teman yang relatif baru, API aliran. Jika Anda perlu daftar preproses sebelum mengonversinya menjadi satu set, lebih baik untuk memiliki sesuatu seperti:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

4

Cara terbaik untuk menggunakan konstruktor

Set s= new HashSet(list);

Di java 8 Anda juga dapat menggunakan stream api ::

Set s= list.stream().collect(Collectors.toSet());

3

Ada berbagai cara untuk mendapatkan Set:

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

Ketika kita menggunakan Collectors.toSet()mengembalikan set dan per doc: There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. Jika kita ingin mendapatkan HashSetmaka kita bisa menggunakan alternatif lain untuk mendapatkan satu set (centang set3).


3

Dengan Java 10, sekarang Anda dapat menggunakannya Set#copyOfuntuk dengan mudah mengkonversi List<E>ke yang tidak dapat dimodifikasi Set<E>:

Contoh:

var set = Set.copyOf(list);

Ingatlah bahwa ini adalah operasi yang tidak berurutan, dan nullelemen tidak diizinkan, karena akan membuang a NullPointerException.

Jika Anda ingin itu dapat dimodifikasi, maka cukup kirimkan ke konstruktor Setimplementasi.


2

Solusi yang lebih tangguh dengan Java 8 Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

2

Jika Anda menggunakan Eclipse Collections :

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

The MutableSetantarmuka meluas java.util.Setsedangkan MutableIntSetantarmuka tidak. Anda juga dapat mengonversi apa saja Iterablemenjadi Setmenggunakan Setskelas pabrik.

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

Ada lebih banyak penjelasan tentang pabrik yang bisa berubah yang tersedia di Eclipse Collections di sini .

Jika Anda menginginkan ImmutableSetdari List, Anda dapat menggunakan Setspabrik sebagai berikut:

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

Catatan: Saya pengendara untuk Eclipse Collections


0

Ingat bahwa, mengonversi dari Daftar ke Set akan menghapus duplikat dari koleksi karena Daftar mendukung duplikat tetapi Set tidak mendukung duplikat di Jawa.

Konversi Langsung: Cara paling umum dan sederhana untuk mengonversi Daftar ke Perangkat

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

Koleksi Apache Commons: Anda juga dapat menggunakan Commons Collections API untuk mengonversi Daftar ke Perangkat: -

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

Menggunakan Stream: Cara lain adalah mengonversi daftar yang diberikan ke streaming, lalu streaming untuk mengatur: -

// 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()); 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.