2016-01-30 13 views
10

जावा 8 में Map<String, Double> से List<Pair<String, Double>> कैसे परिवर्तित करें?जावा में मानचित्र को सूची में कैसे परिवर्तित करें 8

मैं इस कार्यान्वयन लिखा था, लेकिन यह कुशल

Map<String, Double> implicitDataSum = new ConcurrentHashMap<>(); 
//.... 
List<Pair<String, Double>> mostRelevantTitles = new ArrayList<>(); 
implicitDataSum.entrySet().stream(). 
       .sorted(Comparator.comparing(e -> -e.getValue())) 
       .forEachOrdered(e -> mostRelevantTitles.add(new Pair<>(e.getKey(), e.getValue()))); 

return mostRelevantTitles; 

मुझे पता है कि यह काम करता है .collect(Collectors.someMethod()) का उपयोग कर चाहिए नहीं है। लेकिन मुझे समझ में नहीं आता कि यह कैसे करें।

उत्तर

16

ठीक है, आप Pair तत्वों को List में एकत्र करना चाहते हैं। इसका मतलब है कि आपको Stream<Map.Entry<String, Double>> को Stream<Pair<String, Double>> में मैप करना होगा।

यह map संचालन के साथ किया जाता है:

इस धारा के तत्वों को दिया समारोह लागू करने के परिणाम से मिलकर एक धारा देता है।

इस मामले में, समारोह एक समारोह एक Pair<String, Double> में एक Map.Entry<String, Double> परिवर्तित हो जाएगा।

अंत में, आप इसे List में एकत्र करना चाहते हैं, इसलिए हम अंतर्निहित toList() कलेक्टर का उपयोग कर सकते हैं।

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet() 
        .stream() 
        .sorted(Comparator.comparing(e -> -e.getValue())) 
        .map(e -> new Pair<>(e.getKey(), e.getValue())) 
        .collect(Collectors.toList()); 

ध्यान दें कि आप Map.Entry.comparingByValue(Comparator.reverseOrder()) द्वारा तुलनित्र Comparator.comparing(e -> -e.getValue()) बदल सकते थे।

+1

ध्यान दें कि '-e.getValue()' NaN को पुन: व्यवस्थित नहीं करता है। आगे के आदेश में सूची के अंत में 'डबल.NAN' मान होने लगता है। यून्री माइनस का उपयोग करके आप * नाइन को छोड़कर सबकुछ वापस कर देंगे: वे अभी भी सूची के अंत में होंगे। –

+0

हाँ, 'Map.Entry.comparingByValue (Comparator.reverseOrder()) 'या' संग्रह। रिवर्सऑर्डर (Map.Entry.comparingByValue()) '। यदि ऋणात्मक मानों की तुलना करना इरादा है [टैगिर ने अंतर समझाया] (http://stackoverflow.com/questions/35107550/how-to-convert-map-to-list-in-java-8#comment57966768_35107595), फिर 'तुलनाकर्ता मूल्यों के पुनः बॉक्सिंग से बचने के लिए .comparing डबल 'को प्राथमिकता दी जानी चाहिए। – Holger

5

ध्यान दें कि अगर आप कुशल कार्यान्वयन चाहते हैं, तो आप इस पर विचार करना चाहिए:

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet() 
        .stream() 
        .map(e -> new Pair<>(e.getKey(), e.getValue())) 
        .collect(Collectors.toList()); 
mostRelevantTitles.sort(Comparators.comparing(Pair::getSecond, Comparator.reverseOrder())); 

मुझे लगता है कि अपने Pair वर्ग getSecond गेटर है।

sorted() स्ट्रीम पाइपलाइन चरण का उपयोग करके आप इंटरमीडिएट बफर बनाते हैं, उस बफर में सबकुछ स्टोर करते हैं, इसे सरणी में परिवर्तित करते हैं, उस सरणी को सॉर्ट करते हैं, फिर परिणाम को ArrayList में संग्रहीत करते हैं। मेरा दृष्टिकोण, हालांकि कम कार्यात्मक, डेटा को सीधे ArrayList में संग्रहीत करता है, फिर बिना किसी अतिरिक्त प्रतिलिपि के इसे स्थान पर रखता है। तो मेरे समाधान में कम समय और मध्यवर्ती स्मृति लगेगी।

संबंधित मुद्दे

 संबंधित मुद्दे