2016-09-07 6 views
9

मैं नीचेपरिवर्तित मानचित्र <K, V> मानचित्र <V,List<K>>

Map<String, String> values = new HashMap<String, String>(); 
values.put("aa", "20"); 
values.put("bb", "30"); 
values.put("cc", "20"); 
values.put("dd", "45"); 
values.put("ee", "35"); 
values.put("ff", "35"); 
values.put("gg", "20"); 

मैं प्रारूप Map<String,List<String>> में नया नक्शा बनाना चाहते हैं के रूप में नक्शे है, नमूना उत्पादन किया जाएगा के रूप में

"20" -> ["aa","cc","gg"] 
"30" -> ["bb"] 
"35" -> ["ee","ff"]  
"45" -> ["dd"] 

मैं क्या करने में सक्षम हूँ इकाई

Map<String, List<String>> output = new HashMap<String,List<String>>(); 
    for(Map.Entry<String, String> entry : values.entrySet()) { 
     if(output.containsKey(entry.getValue())){ 
      output.get(entry.getValue()).add(entry.getKey()); 

     }else{ 
      List<String> list = new ArrayList<String>(); 
      list.add(entry.getKey()); 
      output.put(entry.getValue(),list); 
      } 
    } 

स्ट्रीम के माध्यम से इसे बेहतर ढंग से किया जा सकता है रों?

उत्तर

12

groupingBy मूल्यों द्वारा कुंजी को समूहित करने के लिए उपयोग किया जा सकता है। यदि mappingCollector के बिना उपयोग किया जाता है, तो यह Stream मानचित्र प्रविष्टियों (Stream<Map.Entry<String,String>>) को Map<String,List<Map.Entry<String,String>> पर बदल देगा, जो आप चाहते हैं कि करीब है, लेकिन काफी नहीं।

उत्पादन Map के मूल्य के लिए आदेश मूल चाबियों का एक List होने के लिए, आप श्रृंखला के लिए है एक mappinggroupingByCollector को Collector

Map<String,List<String>> output = 
    values.entrySet() 
      .stream() 
      .collect(Collectors.groupingBy(Map.Entry::getValue, 
             Collectors.mapping(Map.Entry::getKey, 
                  Collectors.toList()))); 
System.out.println (output); 

आउटपुट:

{45=[dd], 35=[ee, ff], 30=[bb], 20=[aa, cc, gg]} 
4

ध्यान दें कि जावा 8 में, आप भी Map.forEach और Map.computeIfAbsent का उपयोग कर धाराओं का उपयोग किए बिना बेहतर कर सकते हैं। इस तरह, यह Map.Entry<String, String> के साथ पुराने संस्करण, entry.getValue(), entry.getKey() आदि की तुलना में अधिक संक्षिप्त है

तो आपको लगता है कि जावा-8 धारा समाधान करने के लिए पुराने जावा-7 यात्रा की तुलना करने की जरूरत नहीं है, लेकिन यह एक करने के लिए।

values.forEach((key,value)-> 
    groupBy.computeIfAbsent(value, x->new ArrayList<>()) 
      .add(key) 
); 
संबंधित मुद्दे