2015-05-23 7 views
5

मैं 5-मिनट अंतराल में time विशेषता वाले ऑब्जेक्ट्स की एक सूची को समूहित करना चाहता हूं, अधिमानतः धाराओं और कलेक्टरों का उपयोग करना।धाराओं और जावा 8 का उपयोग करके विशेषता द्वारा अन्य सूचियों में किसी सूची में ऑब्जेक्ट्स को समूहित करने के लिए कैसे करें?

स्टैक ओवरव्लो पर मिले एकमात्र संभावित समाधान की गणना करना है कि मुझे कितने अंतराल (sublists) की आवश्यकता है, इन ऑब्जेक्ट्स में से प्रत्येक को प्रत्येक ऑब्जेक्ट जोड़ें और उन सभी को फ़िल्टर करें जो संबंधित समय सीमा में फिट नहीं हैं, जो बिल्कुल नहीं है एक अच्छा समाधान

मैं यह करने के लिए कुछ इसी तरह के बारे में सोचा:

List<MyObject> list = new ArrayList<MyObject>(); 
....... 
List<List<MyObject>> grouped = list.stream().collect(Collectors.groupingBy(obj -> obj.getTime()/intervalLength)); 

बेशक यह doenst काम:

(How to group elements of a List by elements of another in Java 8 आप थ्रेड यहां पा सकते हैं)।

मुझे आशा है कि, जावा 8 & के साथ इसकी विशेषताओं का उपयोग अधिक से अधिक किया जा रहा है, हम ऐसी समस्या के लिए एक सूटिंग समाधान पा सकते हैं।

सादर, Claas एम

संपादित करें: अंत में, मैं @Harsh पोद्दार के समाधान का इस्तेमाल किया और का उपयोग कर

for(Map.Entry<Integer, List<MyObject>> entry:map.entrySet()) 
    list.add(entry.getValue()); 

नोट सूचियाँ की एक सूची में मानचित्र परिवर्तित: सूची पड़ा बाद में सॉर्ट किया जाना चाहिए।

उत्तर

4

यह पूरी तरह ठीक काम करता है:

Map<Long,<List<MyObject>> grouped = ticks.stream().collect(Collectors.groupingBy(obj -> obj.getTime()/intervalLength)); 

इस विधि आप एक नक्शा है जिस पर आप तो .values ​​कॉल कर सकते हैं दे देंगे() सूचियों की सूची प्राप्त करने के लिए। पहले तत्व में obj.getTime() से 0 से intervalLength के तत्व शामिल होंगे बशर्ते ऐसे तत्व थे। अब आप

ticks.stream().collect(groupingBy(e -> bucketNumber(baseTime, e.getTime())); 

:

// assume time is in seconds 
int bucketNumber(int baseTime, int thisTime) { 
    return (thisTime - baseTime)/300; 
} 

तो बाल्टी संख्या से इकट्ठा: दूसरे intervalLength से intervalLength * 2 करने के लिए और इतने

+0

यह काम करता है, धन्यवाद! –

4

पर एक बाल्टी के लिए एक समय मैप करने के लिए एक समारोह का प्रयोग करें में शामिल होंगे Map<Integer, List<Tick>> है जहां कुंजी baseTime से शुरू होने वाली पांच मिनट की बाल्टी की अनुक्रमणिका है, और उस बाल्टी में टिकों की एक सूची है। यदि आप केवल हिस्टोग्राम चाहते हैं, तो डाउनस्ट्रीम कलेक्टर का उपयोग करें:

ticks.stream().collect(groupingBy(e -> bucketNumber(baseTime, e.getTime()), 
            counting()); 
+1

@ हरशपोडदार आप तक। मैं यह समझाने की कोशिश कर रहा था कि समस्या को कैसे तोड़ना है, क्योंकि ऐसा लगता है कि ओपी को परेशानी हो रही थी। –

+0

आपके उत्तर के लिए धन्यवाद! –

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

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