Saya menggunakan kode ini untuk mengonversi a Set
ke List
:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
Saya ingin menghindari membuat daftar baru di setiap iterasi dari loop. Apakah itu mungkin?
java
performance
list
set
Muhammad Imran Tariq
sumber
sumber
Jawaban:
Anda dapat menggunakan metode List.addAll () . Itu menerima Koleksi sebagai argumen, dan set Anda adalah Koleksi.
EDIT: sebagai tanggapan terhadap pengeditan pertanyaan.
Sangat mudah untuk melihat bahwa jika Anda ingin memiliki
Map
denganList
s sebagai nilai-nilai, dalam rangka untuk memiliki nilai-nilai k yang berbeda, Anda perlu membuat k daftar yang berbeda.Jadi: Anda tidak dapat menghindari membuat daftar ini sama sekali, daftar tersebut harus dibuat.
Kemungkinan
penyelesaian : Nyatakan
Map
sebagaiMap<String,Set>
atauMap<String,Collection>
sebagai gantinya, dan cukup masukkan set Anda.sumber
differentKeyName
mengubah setiap iterasi? Apakah Anda benar-benar menginginkansomething.size()
nilai yang berbeda di peta Anda? Sangat mudah untuk melihat bahwa peta dengank
daftar sebagai nilai perlu membuat setidaknyak
daftar.Gunakan konstruktor untuk mengonversinya:
sumber
Juga dari koleksi Guava Collect, Anda dapat menggunakan
newArrayList(Collection)
:Ini akan sangat mirip dengan jawaban sebelumnya dari amit , kecuali bahwa Anda tidak perlu mendeklarasikan (atau menginisialisasi)
list
objek apa pun .sumber
ArrayList
konstruktor.new ArrayList<>([your_set])
.Kita dapat menggunakan satu liner berikut di Java 8:
Ini adalah satu contoh kecil:
sumber
Saya ingin cara yang sangat cepat untuk mengubah set saya ke Daftar dan mengembalikannya, jadi dalam satu baris saya lakukan
sumber
Anda dapat menggunakan perubahan satu baris ini:
Arrays.asList(set.toArray(new Object[set.size()]))
sumber
Saya akan lakukan:
sumber
Karena belum disebutkan sejauh ini, pada Java 10 Anda dapat menggunakan
copyOf
metode pabrik baru :Dari Javadoc :
sumber
Java 8 menyediakan opsi untuk menggunakan stream dan Anda bisa mendapatkan daftar dari
Set<String> setString
sebagai:Padahal implementasi internal seperti yang sekarang menyediakan contoh
ArrayList
:tapi JDK tidak menjaminnya. Seperti yang disebutkan di sini :
Jika Anda ingin selalu yakin maka Anda dapat meminta contoh khusus sebagai:
sumber
Saya membuat
static
metode sederhana :... atau jika Anda ingin mengatur jenis Daftar, Anda dapat menggunakan:
sumber
Baru-baru ini saya menemukan ini:
sumber
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Demi kelengkapan ...
Katakan bahwa Anda benar - benar ingin memperlakukan
Map
nilai sebagaiList
s, tetapi Anda ingin menghindari menyalinSet
ke dalamList
setiap waktu.Misalnya, mungkin Anda memanggil satu fungsi pustaka yang menciptakan
Set
, tetapi Anda meneruskanMap<String, List<String>>
hasil Anda ke fungsi pustaka (yang dirancang dengan buruk tetapi tidak ada di tangan Anda) yang hanya membutuhkan waktuMap<String, List<String>>
, meskipun entah bagaimana Anda tahu bahwa operasi itu dilakukan denganList
s sama-sama berlaku untuk semuaCollection
(dan dengan demikian adaSet
). Dan untuk beberapa alasan Anda perlu menghindari kecepatan / memori overhead menyalin setiap Set ke Daftar.Dalam kasus ceruk super ini, tergantung pada perilaku (mungkin tidak diketahui) fungsi perpustakaan perlu dari Anda
List
, Anda mungkin dapat membuatList
tampilan atas setiap Set. Perhatikan bahwa ini pada dasarnya tidak aman (karena persyaratan fungsi pustaka dari masingList
- masing mungkin bisa berubah tanpa Anda sadari), jadi solusi lain harus lebih disukai. Tapi begini caranya.Anda akan membuat kelas yang mengimplementasikan
List
antarmuka, mengambilSet
dalam konstruktor dan menetapkan bahwa Set ke bidang, dan kemudian menggunakan internal ituSet
untuk mengimplementasikanList
API (sejauh mungkin, dan diinginkan).Perhatikan bahwa beberapa perilaku Daftar yang tidak dapat Anda tiru tanpa menyimpan elemen sebagai
List
, dan beberapa perilaku yang hanya sebagian Anda dapat tiru. Sekali lagi, kelas ini bukan pengganti drop-in yang aman untukList
s secara umum. Secara khusus, jika Anda tahu bahwa use case membutuhkan operasi terkait indeks atau MUTATINGList
, pendekatan ini akan berjalan sangat cepat ke selatan.sumber
Saya menemukan ini berfungsi dengan baik dan berguna untuk membuat Daftar dari Set.
sumber
sumber