2015-05-23 61 views
5

Tôi muốn nhóm một Danh sách các đối tượng có chứa thuộc tính time thành các khoảng thời gian 5 phút, tốt nhất là sử dụng các luồng và bộ sưu tập. Giải pháp duy nhất tôi có thể tìm thấy trên StackOverflow là tính toán bao nhiêu khoảng (danh sách con) tôi cần, thêm mọi đối tượng vào mỗi Danh sách này và lọc ra những đối tượng không phù hợp với khung thời gian tương ứng, không chính xác một giải pháp tốt đẹp.Làm thế nào để nhóm đối tượng trong một danh sách vào danh sách khác theo thuộc tính bằng cách sử dụng suối & Java 8?

(Bạn có thể tìm thấy những bài viết ở đây: How to group elements of a List by elements of another in Java 8)

Tôi nghĩ đến một cái gì đó tương tự như sau:

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

Điều này tất nhiên công việc doenst.

Tôi hy vọng rằng, với Java 8 & các tính năng của nó đang được sử dụng ngày càng nhiều, chúng ta có thể tìm ra giải pháp suting cho một vấn đề như vậy.

Kính trọng, Claas M.

EDIT: In the End, tôi đã sử dụng giải pháp @Harsh Poddar và chuyển bản đồ vào một danh sách liệt kê sử dụng

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

Lưu ý: Danh sách đã phải được sắp xếp sau đó.

Trả lời

4

này hoạt động hoàn toàn tốt:

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

Phương pháp này sẽ cung cấp cho bạn một bản đồ mà trên đó thì bạn có thể gọi .values ​​() để có được danh sách liệt kê. Phần tử đầu tiên sẽ chứa các phần tử với obj.getTime() từ 0 đến intervalLength được cung cấp có các phần tử như vậy. Thứ hai sẽ chứa từ intervalLength để intervalLength * 2 và vân vân

+0

Điều đó có hiệu quả, cảm ơn bạn! –

4

Sử dụng một chức năng để ánh xạ một thời gian để một xô:

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

Sau đó thu thập theo số xô:

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

Bây giờ bạn có mã số Map<Integer, List<Tick>> trong đó khóa là chỉ mục của nhóm năm phút bắt đầu tại baseTime và danh sách các dấu tích trong nhóm đó. Nếu bạn chỉ muốn một biểu đồ, hãy sử dụng trình thu thập ở dưới:

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

@HarshPoddar Tùy thuộc vào bạn. Tôi đã cố gắng để minh họa làm thế nào để phá vỡ vấn đề xuống, vì đó dường như là nơi OP gặp rắc rối. –

+0

Cảm ơn câu trả lời của bạn! –

Các vấn đề liên quan