วิธีแปลง Map เป็น List ใน Java


675

วิธีที่ดีที่สุดในการแปลง a Map<key,value>เป็นList<value>คืออะไร? แค่วนซ้ำค่าทั้งหมดและใส่ในรายการหรือฉันจะมองอะไรบางอย่าง?


1
ฉันคิดว่ามันไม่ใช่โมเดลที่ดีหากต้องแปลงแผนที่เป็นรายการ หนึ่งควรเขียนรหัสในลักษณะที่สถานการณ์นี้ไม่ได้ arrise
บั๊กเกิดขึ้น

คำตอบ:


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

สมมติว่า:

Map<Key,Value> map;

7
ขอบคุณ! ฉันสมมติว่านักแสดงจากCollectionถึงListทำงาน
asgs

1
ฉันสงสัยว่าสาเหตุที่ใช้งานไม่ได้เนื่องจากการรวบรวมที่ส่งคืนโดยค่า () ขึ้นอยู่กับแผนที่พื้นฐาน ด้วยการโทรคอนสตรัคเตอร์คัดลอกแทนคุณจัดสรรหน่วยเก็บและคัดลอกค่าลงในหน่วยเก็บนั้นจึงทำลายการเชื่อมต่อ ...
เชลดอนอาร์

4
หากเรามี LinkedHashMap - คำสั่งนั้นจะเหมือนเดิมหรือไม่?

1
@ user2022068 ใช่คำสั่งควรเก็บไว้ด้วย LinkedHashMap
SusanW

1
@SheldonR ใช่ - คอลเลกชันที่ส่งกลับโดยkeySet()และvalues()เป็นวัตถุชิมกันโดยทั่วไปว่าให้ชุดเก็บหรือมุมมองของโครงสร้างพื้นฐาน ( keySet()ผลตอบแทนชุดจะเน้นไม่หลอก) สำหรับvalues()วัตถุที่ส่งคืนอาจเป็นListแต่มักจะไม่ การสร้างรายการจริงดังที่คุณพูดแบ่งการเชื่อมโยงซึ่งหมายความว่าคุณไม่ต้องพึ่งพาแผนที่เดิมอีกต่อไป บางครั้งคุณต้องการเพียง List เพราะ API บางตัวต้องการหนึ่ง - ตอกย้ำกฎที่ API ที่ดีควรใช้เพียงส่วนต่อประสานที่เป็นนามธรรมมากที่สุดเท่านั้นที่จะได้รับ ...
SusanW

137

ปัญหาที่นี่คือที่Mapมีสองค่า (คีย์และค่า) ในขณะที่มีListเพียงหนึ่งค่า (องค์ประกอบ)

ดังนั้นสิ่งที่ดีที่สุดที่สามารถทำได้คือการได้รับListกุญแจหรือค่า (เว้นเสียแต่ว่าเราจะให้เสื้อคลุมเพื่อยึดคู่ของคีย์ / ค่าไว้)

บอกว่าเรามีMap:

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

Listสามารถรับคีย์ได้โดยสร้างใหม่ArrayListจากวิธีที่Setส่งคืนโดยMap.keySet:

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

ในขณะที่ค่าตามที่Listสามารถได้รับการสร้างใหม่ArrayListจากวิธีการCollectionส่งกลับMap.values:

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

ผลลัพธ์ของการรับListกุญแจ:

แอปเปิ้ล
อื่น
สวัสดี

ผลลัพธ์ของการรับListค่า:

3.14
ธาตุ
โลก

3
ควรสังเกตว่าลำดับของค่าที่ส่งคืนโดยเมธอดเหล่านั้นไม่ได้ถูกกำหนดไว้และสำหรับการใช้งานที่HashMapไม่ได้เรียงแบบที่คล้ายกันซึ่งMapจะเป็นการสุ่มอย่างมีประสิทธิภาพ
Joachim Sauer

1
ใช่คุณจะต้องรู้ว่ามันคือ LinkedHashMap หรืออะไรทำนองนั้น ปัญหาของคำถามเดิมคือคำถามนั้นผิดที่ต้องแก้ไข คำถามไม่ได้แปลงแผนที่เป็นรายการ แต่จะทำอย่างไรจึงจะได้ค่าของแผนที่เป็นรายการ ค่าของวิธีการนี้จะให้คอลเลกชันของคุณ แต่ไม่ใช่ลิสต์และด้วยเหตุนี้จึงจำเป็นต้องมีเล่ห์เหลี่ยมเล็กน้อย
demongolem

ฉันคิดว่าคุณสามารถเพิ่มคำตอบของคุณในสิ่งที่ @ M0les พูดว่า: คุณจะต้อง "ผ่าน" SortedMap อย่างใด เริ่มต้นด้วยการใช้ SortedMap ที่เป็นรูปธรรม (เช่น TreeMap) หรือแทรกแผนที่อินพุตของคุณลงใน SortedMap ก่อนที่จะแปลงเป็นรายการ
Ignacio Rubio

41

การใช้ Java 8 Streams API

List<Value> values = map.values().stream().collect(Collectors.toList());

8
ฉันชอบคำตอบตามตัวสร้างที่ยอมรับ สตรีมควรเป็นรหัสที่ทำให้เข้าใจง่าย
แอรอน

1
@Aaron ใช่สำหรับการรับรายการค่าจาก Map คอนสตรัคเตอร์ดูเหมือนจะง่ายกว่า อย่างไรก็ตามหากคุณใช้ Streams อย่างกว้างขวางใน codebase จะเป็นการดีกว่าหากคุณคงความสม่ำเสมอ
Matej Kormuth

1
เมื่อฉันใช้สิ่งนี้จะได้รับข้อผิดพลาดถ้าฉันดึงข้อมูลจำนวนมาก .. เธรดกำลังวนซ้ำบน java.util.stream.ReduceOps $ 3.makeSink (ไม่ทราบแหล่งที่มา) หากเธรดวนซ้ำไม่สิ้นสุดการใช้งาน CPU จะเริ่มขัดขวาง การวน
Ganesh Giri

24

map.entrySet()ให้คอลเลกชันMap.Entryวัตถุที่มีทั้งคีย์และค่า จากนั้นคุณสามารถแปลงสิ่งนี้เป็นวัตถุคอลเลกชันที่คุณต้องการเช่นnew ArrayList(map.entrySet());


23

รายการอะไร

สมมติว่าmapเป็นตัวอย่างของคุณMap

  • map.values()จะส่งคืนค่าCollectionที่มีทั้งหมดของแผนที่
  • map.keySet()จะคืนค่าSetคีย์ของแผนที่ทั้งหมดที่มี

14

ฉันเดาว่าคุณต้องการแปลงค่าที่อยู่ในMapa เป็นlist? ที่ง่ายที่สุดคือการเรียกvalues()วิธีการของMapอินเตอร์เฟซ นี่จะคืนCollectionค่าของวัตถุที่มีค่าในMapของค่าวัตถุที่มีอยู่ใน

โปรดทราบว่าสิ่งนี้Collectionได้รับการสนับสนุนโดยMapวัตถุและการเปลี่ยนแปลงใด ๆ กับMapวัตถุจะสะท้อนที่นี่ ดังนั้นหากคุณต้องการสำเนาแยกต่างหากที่ไม่ผูกกับMapวัตถุของคุณเพียงแค่สร้างListวัตถุใหม่เช่นการArrayListส่งผ่านค่าCollectionดังต่อไปนี้

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

6

คุณสามารถทำได้เช่นนี้

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

1
OP ถามเกี่ยวกับวิธีแปลงเป็นรายการ <value> เมื่อให้คำตอบควรรวมคำอธิบายที่ดีกับโซลูชันที่เสนอ คำถามนี้ได้รับคำตอบแล้ว
HaveNoDisplayName

5

หากคุณต้องการให้แน่ใจว่าค่าในผลลัพธ์List<Value>อยู่ในการเรียงลำดับคีย์ของอินพุตMap<Key, Value>คุณต้อง "ผ่าน"SortedMapอย่างใด

ทั้งสองเริ่มต้นด้วยการที่เป็นรูปธรรมSortedMapการดำเนินงาน (เช่นTreeMap) หรือแทรกเข้าของคุณMapเป็นก่อนที่จะแปลงที่SortedMap Listเช่น:

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

ไม่เช่นนั้นคุณจะได้รับคำสั่งซื้อจากเจ้าของภาษาใด ๆ ก็ตามMapซึ่งมักจะเป็นสิ่งอื่นนอกเหนือจากการสั่งซื้อรหัสธรรมชาติ (ลองHashtableหรือConcurrentHashMapเพื่อความหลากหลาย)


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

เราสามารถมีทั้งคู่คีย์และค่าในรายการนอกจากนี้ยังสามารถรับคีย์และค่าโดยใช้ Map.Entry โดยทำซ้ำผ่านรายการ


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

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

1

นี่คือวิธีการทั่วไปในการรับค่าจากแผนที่

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

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());
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.