2016-07-31 11 views
5

हैलो मैं अपने वस्तु वस्तुओं की एक सूची है तीन क्षेत्रोंपरिवर्तित सूची धाराओं

class MyObject{ 
    String x; 
    String y; 
    int z; 
    //getters n setters 
} 

मैं एक में यह सूची बदलने की आवश्यकता है Map<String,Map<String,Integer>>

जो इस तरह है: {x1:{y1:z1,y2:z2,y3:z3},x2{y4:z4,y5:z5}} प्रारूप मैं जावा 8 में ऐसा करना चाहता हूं जो मुझे लगता है कि मैं इसके लिए अपेक्षाकृत नया हूं।

Map<String,Map<String,Integer>> map=list.stream(). 
       collect(Collectors. 
         groupingBy(MyObject::getX,list.stream(). 
           collect(Collectors.groupingBy(MyObject::getY, 
             Collectors.summingInt(MyObject::getZ))))); 

यह और भी संकलन नहीं करता है:

मैं निम्नलिखित की कोशिश की है।

Map<String,Map<String,Integer>> map = 
    list.stream() 
     .collect(Collectors. 
        groupingBy(MyObject::getX, 
           Collectors.groupingBy(MyObject::getY, 
                Collectors.summingInt(MyObject::getZ)))); 

मुझे आशा है कि मैं तर्क आप सही चाहता था मिल गया: मदद ज्यादा दो groupingByCollector और एक summingIntCollector चेनिंग द्वारा

+3

एक नमूना इनपुट प्रदान करें, आप कैसे उन सभी y के और z के मिल स्पष्ट नहीं है एक एक्स –

+0

से बाहर आपको अपनी स्ट्रीम का पुन: उपयोग नहीं करना चाहिए, न ही आपको भी इसकी आवश्यकता होनी चाहिए। मुझे नहीं लगता कि समस्या स्ट्रीम के लिए एक अच्छा मैच है, क्योंकि मुझे लगता है कि आप पहले दो तत्वों को लेने की कोशिश कर रहे हैं और उन्हें '' MyObject.x''' और तीसरे और आगे के तत्वों के लिए मानचित्र बनाते हैं और उन्हें मानचित्र बनाते हैं दूसरे तत्व एक्स मान। एक कस्टम कलेक्टर के साथ यह संभव हो सकता है, लेकिन आप बहुत सारे राज्य में हेरफेर कर रहे हैं – Gavin

उत्तर

7

तुम कर सकते हो की सराहना की है।

जब इनपुट List निम्नलिखित को जोड़ने:

list.add(new MyObject("A","B",10)); 
list.add(new MyObject("A","C",5)); 
list.add(new MyObject("A","B",15)); 
list.add(new MyObject("B","C",10)); 
list.add(new MyObject("A","C",12)); 

आप एक निर्गम के Map मिलती है:

{A={B=25, C=17}, B={C=10}} 
संबंधित मुद्दे