जावा में लिस्ट में मैप कैसे बदलें?


674

A Map<key,value>को a में बदलने का सबसे अच्छा तरीका क्या है List<value>? बस सभी मूल्यों पर पुनरावृत्ति करें और उन्हें एक सूची में डालें या क्या मैं कुछ अनदेखी कर रहा हूं?


1
मुझे लगता है कि अगर किसी को नक्शे को सूची में बदलना पड़े तो यह अच्छा मॉडल नहीं है। किसी को इस तरह से कोड लिखना चाहिए कि यह स्थिति गिरफ्तार न हो।
कीड़े

जवाबों:


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

यह सोचते हैं:

Map<Key,Value> map;

7
धन्यवाद! मैं कलाकारों को काम Collectionकरने से मान रहा था List
asgs

1
मुझे इस कारण पर संदेह है कि यह काम नहीं करता है क्योंकि संग्रह मानों द्वारा लौटाया गया है () अंतर्निहित मानचित्र पर निर्भर है; इसके बजाय एक कॉपी कंस्ट्रक्टर कॉल करके, आप स्टोरेज को आवंटित करते हैं और उस स्टोरेज में वैल्यूज को कॉपी करते हैं, जिससे कनेक्शन टूट जाता है ...
शेल्डन आर।

4
अगर हमारे पास LinkedHashMap है - तो क्या ऑर्डर समान होगा?

1
@ user2022068 हां, आदेश को LinkedHashMap के साथ संरक्षित किया जाना चाहिए।
सुसानडब्लू

1
@SheldonR। हाँ - संग्रह द्वारा लौटाया जाता है keySet()और values()आम तौर पर ऐसी वस्तुएं होती हैं जो अंतर्निहित संरचना का एक सेट या संग्रह दृश्य keySet()देती हैं ( रिटर्न सेट पर कोई प्रतिबंध नहीं है)। के लिए values(), दी गई वस्तु एक हो सकती है List, लेकिन अक्सर नहीं होगी। एक वास्तविक सूची बनाना, जैसा कि आप कहते हैं, लिंक को तोड़ देता है जिसका अर्थ है कि आप अब मूल मानचित्र पर निर्भर नहीं हैं। हालांकि कभी-कभी, आपको केवल एक सूची की आवश्यकता होती है क्योंकि कुछ एपीआई को एक की आवश्यकता होती है - नियम को मजबूत करने के लिए कि एक अच्छा एपीआई को केवल सबसे सार इंटरफेस की आवश्यकता होती है जो इसके साथ दूर हो सके ...
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किए गए कार्यान्वयनों के लिए यह प्रभावी रूप से यादृच्छिक होगा।
जोकिम सॉर

1
हाँ, आपको यह जानना होगा कि यह लिंक्डहैश मैप है या उस तरह का कुछ है। मूल प्रश्न के साथ समस्या यह है कि प्रश्न गलत है, क्या इसे संपादित करने की आवश्यकता है। प्रश्न मानचित्र को सूची में परिवर्तित करने के लिए नहीं है, बल्कि यह है कि सूची के रूप में मानचित्र के मूल्यों को कैसे प्राप्त किया जाए। विधि मान आपको एक संग्रह देता है, लेकिन एक सूची नहीं है, और इसलिए एक स्वच्छ छोटी चाल की आवश्यकता है।
डेमॉन्गोलम

मुझे लगता है कि आप अपने जवाब में जोड़ सकते हैं कि @ M0les क्या कहता है: कि आपको किसी तरह "SortedMap के माध्यम से" जाने की आवश्यकता होगी। या तो एक ठोस SortedMap कार्यान्वयन (जैसे TreeMap) के साथ शुरू करें या सूची में कनवर्ट करने से पहले अपने इनपुट मानचित्र को SortedMap में डालें
इग्नासियो रूबियो

41

जावा 8 स्ट्रीम एपीआई का उपयोग करना।

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

8
मैं स्वीकृत, निर्माता-आधारित उत्तर पसंद करता हूं। कोड को सरल बनाने के लिए धाराएँ होनी चाहिए।
हारून

1
@ एरन हां, मानचित्र से मूल्यों की सूची प्राप्त करने के कार्य के लिए निर्माणकर्ता सरल प्रतीत होता है। हालाँकि अगर आप एक कोडबेस में धाराओं का अत्यधिक उपयोग कर रहे हैं तो लगातार रहना बेहतर है।
मतेज कोरमुथ

1
जब मैं डेटा का भारी मात्रा में उपयोग कर रहा हूं तो मुझे एक त्रुटि मिलती है .. तब java.util.stream पर लूपिंग होता है। RuceuceOps $ 3.makeSink (अज्ञात स्रोत)। यदि थ्रेड लूप असीम रूप से आते हैं, तो सीपीयू की खपत बढ़नी शुरू हो जाएगी। लूपिंग थ्रेड्स स्टैक ट्रेस नीचे दिए गए हैं, इसकी जांच करें
गणेश गिरी

24

map.entrySet()आपको Map.Entryकुंजी और मान दोनों युक्त वस्तुओं का संग्रह देता है । फिर आप इसे किसी भी संग्रह वस्तु में बदल सकते हैं जिसे आप पसंद करते हैं, जैसे new ArrayList(map.entrySet());


23

क्या की एक सूची?

मान लें mapकि आपका उदाहरण हैMap

  • map.values()Collectionनक्शे के सभी मानों से युक्त होगा ।
  • map.keySet()Setनक्शे की कुंजियों से युक्त सभी को लौटाएगा ।

14

मुझे लगता है कि आप Mapएक में निहित मूल्यों को परिवर्तित करना चाहते हैं 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
ओपी सूची <मूल्य> में बदलने के बारे में पूछें। जब उत्तर प्रदान करते हैं, तो प्रस्तावित समाधान के साथ एक अच्छा विवरण शामिल करना बेहतर होता है। इस प्रश्न का उत्तर पहले ही स्वीकार कर लिया गया है।
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);

हमारे पास सूची में कुंजी और मूल्य जोड़ी दोनों हो सकते हैं। इसके अलावा मैप के उपयोग से कुंजी और मान प्राप्त कर सकते हैं। सूची में पुनरावृति करके।


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());
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.