Bagaimana cara mengubah Peta ke Daftar di Jawa?

675

Apa cara terbaik untuk mengonversi a Map<key,value>ke a List<value>? Ulangi semua nilai dan masukkan dalam daftar atau apakah saya mengabaikan sesuatu?

Javaa
sumber
1
Saya pikir itu bukan model yang baik jika seseorang harus mengubah peta menjadi daftar. Seseorang harus menulis kode sedemikian rupa sehingga situasi ini tidak muncul.
Bugs Terjadi

Jawaban:

1299
List<Value> list = new ArrayList<Value>(map.values());

asumsi:

Map<Key,Value> map;
cletus
sumber
7
Terima kasih! Saya berasumsi para pemain dari Collectionke Listakan bekerja.
asgs
1
Saya menduga alasan itu tidak berhasil adalah karena koleksi yang dikembalikan oleh nilai () bergantung pada Peta yang mendasarinya; dengan membuat panggilan copy constructor sebagai gantinya, Anda mengalokasikan penyimpanan dan menyalin nilai-nilai ke dalam penyimpanan itu, sehingga memutus koneksi ...
Sheldon R.
4
Jika kita memiliki LinkedHashMap - apakah pesanan akan tetap sama?
1
@ user2022068 ya, pesanan harus dilestarikan dengan LinkedHashMap.
SusanW
1
@SheldonR. ya - koleksi dikembalikan oleh keySet()dan values()umumnya benda shim yang memberikan tampilan Set atau Koleksi struktur yang mendasarinya ( keySet()mengembalikan Set untuk menekankan tidak ada dupes). Sebab values(), objek yang dikembalikan mungkin a List, tetapi sering kali tidak. Membuat Daftar asli, seperti yang Anda katakan, mematahkan tautan yang berarti Anda tidak lagi bergantung pada Peta asli. Namun terkadang, Anda hanya perlu Daftar karena beberapa API memerlukan satu - memperkuat aturan bahwa API yang baik harus hanya memerlukan antarmuka paling abstrak yang bisa lolos ...
SusanW
137

Masalahnya di sini adalah yang Mapmemiliki dua nilai (kunci dan nilai), sedangkan yang Listhanya memiliki satu nilai (elemen).

Oleh karena itu, yang terbaik yang bisa dilakukan adalah mendapatkan salah satu Listkunci atau nilai-nilai. (Kecuali jika kami membuat pembungkus untuk berpegangan pada pasangan kunci / nilai).

Katakanlah kita punya Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

Kunci sebagai a Listdapat diperoleh dengan membuat yang baru ArrayListdari yang Setdikembalikan oleh Map.keySetmetode:

List<String> list = new ArrayList<String>(m.keySet());

Sementara nilai-nilai sebagai Listdapat diperoleh, membuat yang baru ArrayListdari yang Collectiondikembalikan oleh Map.valuesmetode:

List<String> list = new ArrayList<String>(m.values());

Hasil mendapatkan Listkunci:

apel
Lain
Halo

Hasil mendapatkan Listnilai:

3.14
Elemen
Dunia
coobird
sumber
3
Perlu dicatat bahwa urutan nilai yang dikembalikan oleh metode tersebut tidak didefinisikan dan untuk HashMapdan Mapimplementasi serupa yang tidak diurutkan akan secara acak efektif.
Joachim Sauer
1
Ya, Anda harus tahu itu adalah LinkedHashMap atau sejenisnya. Masalah dengan pertanyaan asli adalah bahwa pertanyaan itu salah saji, yang perlu diedit. Pertanyaannya bukan untuk mengonversi Peta menjadi Daftar, melainkan bagaimana cara mendapatkan nilai peta sebagai Daftar. Nilai metode memberi Anda Koleksi, tetapi bukan daftar, dan karenanya perlu trik kecil yang rapi.
demongolem
Saya pikir Anda dapat menambahkan ke jawaban Anda apa yang dikatakan @ M0les: Bahwa Anda harus "pergi melalui" SortedMap. Baik mulai dengan implementasi SortedMap yang konkret (Seperti TreeMap) atau masukkan input Peta Anda ke dalam SortedMap sebelum mengubahnya menjadi Daftar
Ignacio Rubio
41

Menggunakan Java 8 Streams API.

List<Value> values = map.values().stream().collect(Collectors.toList());
Matej Kormuth
sumber
8
Saya lebih suka jawaban yang diterima, berdasarkan konstruktor. Streaming harus untuk menyederhanakan kode.
Aaron
1
@ Harun Ya, untuk tugas mendapatkan Daftar nilai dari Peta, konstruktor tampaknya lebih sederhana. Namun jika Anda menggunakan Streams secara extensivly dalam basis kode, lebih baik tetap konsisten.
Matej Kormuth
1
ketika saya menggunakan ini mendapatkan kesalahan jika saya mengambil sejumlah besar data ..baca di java.util.stream.ReduceOps $ 3.makeSink (Sumber Tidak Dikenal). Jika utas berulang, konsumsi CPU akan mulai meningkat. Jejak tumpukan jejak benang diberikan di bawah ini, memeriksanya
Ganesh Giri
24

map.entrySet()memberi Anda koleksi Map.Entryobjek yang berisi kunci dan nilai. Anda kemudian dapat mengubah ini menjadi objek koleksi yang Anda suka, seperti new ArrayList(map.entrySet());

Bung java
sumber
23

daftar apa?

Dengan asumsi mapadalah contoh dari AndaMap

  • map.values()akan mengembalikan yang Collectionberisi semua nilai peta.
  • map.keySet()akan mengembalikan yang Setberisi semua kunci peta.
Diego Amicabile
sumber
14

Saya kira Anda ingin mengonversi nilai yang terkandung dalam Mapke list? Cara termudah adalah memanggil values()metode Mapantarmuka. Ini akan mengembalikan Collectionobjek nilai yang terkandung dalam Map.

Perhatikan bahwa ini Collectiondidukung oleh Mapobjek dan setiap perubahan pada Mapobjek akan tercermin di sini. Jadi jika Anda ingin salinan terpisah tidak terikat ke Mapobjek Anda , cukup buat Listobjek baru seperti ArrayListmelewatkan nilai Collectionseperti di bawah ini.

ArrayList<String> list = new ArrayList<String>(map.values());
maneesh
sumber
6

Anda bisa melakukannya seperti ini

List<Value> list = new ArrayList<Value>(map.values());
pengguna3752441
sumber
1
OP bertanya tentang cara mengonversi ke Daftar <value>. Saat memberikan jawaban, lebih baik untuk menyertakan Deskripsi Baik dengan solusi yang diusulkan. Pertanyaan ini sudah diterima diterima.
HaveNoDisplayName
5

Jika Anda ingin memastikan nilai-nilai dalam resultan List<Value>berada dalam urutan kunci input Map<Key, Value>, Anda harus "pergi melalui"SortedMap entah bagaimana.

Entah mulai dengan beton SortedMapimplementasi (Seperti TreeMap) atau masukkan input Anda Mapke dalam SortedMapsebelum mengkonversi itu untuk List. misalnya:

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

Kalau tidak, Anda akan mendapatkan pemesanan asli apa pun yang Mapdisediakan oleh implementasi, yang sering kali bisa merupakan sesuatu selain dari pemesanan kunci alami (Coba Hashtableatau ConcurrentHashMap, untuk variasi).

M0les
sumber
5
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

kita bisa memiliki pasangan kunci dan nilai dalam daftar. Juga bisa mendapatkan kunci dan nilai menggunakan Peta. Coba dengan mengulang daftar.

pengguna11
sumber
4
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}
saurabhgoyal795
sumber
1
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "
siva prasad
sumber
1

Inilah metode generik untuk mendapatkan nilai dari peta.

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}
Hiral Pancholi
sumber
1
HashMap<Integer, List<String>> map = new HashMap<>(); 
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
    return new ArrayList<String>((Collection<? extends String>) map.values());
}
Hakan Anlamaz
sumber