วิธีที่ดีที่สุดในการแปลง a Map<key,value>
เป็นList<value>
คืออะไร? แค่วนซ้ำค่าทั้งหมดและใส่ในรายการหรือฉันจะมองอะไรบางอย่าง?
วิธีที่ดีที่สุดในการแปลง a Map<key,value>
เป็นList<value>
คืออะไร? แค่วนซ้ำค่าทั้งหมดและใส่ในรายการหรือฉันจะมองอะไรบางอย่าง?
คำตอบ:
List<Value> list = new ArrayList<Value>(map.values());
สมมติว่า:
Map<Key,Value> map;
Collection
ถึงList
ทำงาน
keySet()
และvalues()
เป็นวัตถุชิมกันโดยทั่วไปว่าให้ชุดเก็บหรือมุมมองของโครงสร้างพื้นฐาน ( keySet()
ผลตอบแทนชุดจะเน้นไม่หลอก) สำหรับvalues()
วัตถุที่ส่งคืนอาจเป็นList
แต่มักจะไม่ การสร้างรายการจริงดังที่คุณพูดแบ่งการเชื่อมโยงซึ่งหมายความว่าคุณไม่ต้องพึ่งพาแผนที่เดิมอีกต่อไป บางครั้งคุณต้องการเพียง List เพราะ API บางตัวต้องการหนึ่ง - ตอกย้ำกฎที่ API ที่ดีควรใช้เพียงส่วนต่อประสานที่เป็นนามธรรมมากที่สุดเท่านั้นที่จะได้รับ ...
ปัญหาที่นี่คือที่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 ธาตุ โลก
HashMap
ไม่ได้เรียงแบบที่คล้ายกันซึ่งMap
จะเป็นการสุ่มอย่างมีประสิทธิภาพ
การใช้ Java 8 Streams API
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()
ให้คอลเลกชันMap.Entry
วัตถุที่มีทั้งคีย์และค่า จากนั้นคุณสามารถแปลงสิ่งนี้เป็นวัตถุคอลเลกชันที่คุณต้องการเช่นnew ArrayList(map.entrySet())
;
รายการอะไร
สมมติว่าmap
เป็นตัวอย่างของคุณMap
map.values()
จะส่งคืนค่าCollection
ที่มีทั้งหมดของแผนที่map.keySet()
จะคืนค่าSet
คีย์ของแผนที่ทั้งหมดที่มีฉันเดาว่าคุณต้องการแปลงค่าที่อยู่ในMap
a เป็นlist
? ที่ง่ายที่สุดคือการเรียกvalues()
วิธีการของMap
อินเตอร์เฟซ นี่จะคืนCollection
ค่าของวัตถุที่มีค่าในMap
ของค่าวัตถุที่มีอยู่ใน
โปรดทราบว่าสิ่งนี้Collection
ได้รับการสนับสนุนโดยMap
วัตถุและการเปลี่ยนแปลงใด ๆ กับMap
วัตถุจะสะท้อนที่นี่ ดังนั้นหากคุณต้องการสำเนาแยกต่างหากที่ไม่ผูกกับMap
วัตถุของคุณเพียงแค่สร้างList
วัตถุใหม่เช่นการArrayList
ส่งผ่านค่าCollection
ดังต่อไปนี้
ArrayList<String> list = new ArrayList<String>(map.values());
คุณสามารถทำได้เช่นนี้
List<Value> list = new ArrayList<Value>(map.values());
หากคุณต้องการให้แน่ใจว่าค่าในผลลัพธ์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
เพื่อความหลากหลาย)
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 โดยทำซ้ำผ่านรายการ
// 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());
}
"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());
} "
นี่คือวิธีการทั่วไปในการรับค่าจากแผนที่
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;
}
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());
}