2015-05-23 10 views
5

time özniteliği içeren Nesnelerin Listesini, tercihen akışları ve toplayıcıları kullanarak 5 dakikalık aralıklarla gruplamak istiyorum.Listedeki Nesneleri Akışlar ve Java 8 kullanarak Niteliklere Göre Diğer Listelere Nasıl Gruplandırılır?

StackOverflow üzerinde bulduğum tek olası çözüm, kaç aralığın (altbilginin) ihtiyacım olduğunu hesaplamak, her bir nesneyi bu Listelerin her birine eklemek ve ilgili zaman dilimine uymayanları filtrelemektir. güzel bir çözüm.

Ben buna benzer bir şey düşündüm:

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

Bu tabii doenst çalışmalarını:

( How to group elements of a List by elements of another in Java 8 Burada Konu bulabilirsiniz).

Umarız, Java 8 &'un özellikleri giderek daha fazla kullanıldığında, böyle bir Problem için bir çimlendirme çözümü bulabiliriz.

Selamlar, Claas M.

DÜZENLEME: End'indeki , ben @Harsh Poddar en çözümünü kullanılan ve

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

Not kullanarak Listelerinin bir Listesine Haritası dönüştürüldü: Liste zorunda kaldı daha sonra sıralanabilir.

cevap

4

Bu tamamen iyi çalışır:

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

Bu yöntem size daha sonra Değerler, çağırabilir hangi bir harita verecektir() listelerinin listesini almak için. İlk öğe, bu gibi elemanlar olması koşuluyla 0'dan aralık uzunluğuna kadar obj.getTime() öğelerini içerir. Şimdi

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

sizi:

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

Sonra kova sayısına göre toplamak: İkinci intervalLength bir kova için bir zaman eşlemek için bir işlevi kullanın intervalLength * 2 ve böylece

+0

Bu işe yaradı, teşekkürler! –

4

üzerine içerecektir Map<Integer, List<Tick>> numaralı telefona sahip olursunuz; burada anahtar, baseTime'dan başlayan beş dakikalık kova dizini ve bu kutudaki kenelerin bir listesidir. Sadece bir histogram istiyorsanız, aşağı akış toplayıcı kullanın:

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

@HarshPoddar Size kalmış. Sorunun nasıl çözüleceğini göstermeye çalışıyordum çünkü bu OP'nin sorun yaşadığı gibi görünüyordu. –

+0

Cevabınız için teşekkürler! –