2016-08-02 42 views
3

我需要你的幫助範圍的列表,的Java 8組值的列表到使用收藏家

在Java 8中使用收藏家groupingBy我需要一羣這樣

ValueObject {id=1, value=2.0} 
ValueObject {id=2, value=2.0} 
ValueObject {id=3, value=2.0} 
ValueObject {id=4, value=3.0} 
ValueObject {id=5, value=3.0} 
ValueObject {id=6, value=4.0} 
ValueObject {id=7, value=4.0} 
ValueObject {id=8, value=4.0} 
ValueObject {id=9, value=4.0} 
ValueObject {id=10, value=4.0} 
在另一個

列表一個這樣的

GroupedObject {from=1, to=3, value=2.0} 
GroupedObject {from=4, to=5, value=3.0} 
GroupedObject {from=6, to=10, value=4.0} 

這些都是對象的定義我使用

public class ValueObject { 

    private int id; 
    private double value; 

    public String getId() { 
    return id; 
    } 

    public float getValue() { 
    return value; 
    } 

    public void setValue(float value) { 
    this.value = value; 
    } 

} 

public class GroupedObject { 

    private int from; 
    private int to; 
    private double value; 

    public int getFrom() { 
     return from; 
    } 

    public void setFrom(int from) { 
     this.from = from; 
    } 

    public int getTo() { 
     return to; 
    } 

    public void setTo(int to) { 
     this.to = to; 
    } 

    public double getValue() { 
     return value; 
    } 

    public void setValue(double value) { 
     this.value = value; 
    } 

} 

這就是我如何以編程方式。

這是單元測試

public class ServiceTest { 

    Service service = new Service(); 

    @Test 
    public void testgGoupToRange() { 

     List entryList = new ArrayList<>(); 

     entryList.add(new ValueObject(1, 2.0)); 
     entryList.add(new ValueObject(2, 2.0)); 
     entryList.add(new ValueObject(3, 2.0)); 
     entryList.add(new ValueObject(4, 3.0)); 
     entryList.add(new ValueObject(5, 3.0)); 
     entryList.add(new ValueObject(6, 4.0)); 
     entryList.add(new ValueObject(7, 4.0)); 
     entryList.add(new ValueObject(8, 4.0)); 
     entryList.add(new ValueObject(9, 4.0)); 
     entryList.add(new ValueObject(10, 4.0)); 

     List responseList = service.groupToRange(entryList); 

     responseList.forEach(obj-> System.out.println(obj.toString())); 

     assertNotNull(responseList); 
     assertEquals(3, responseList.size()); 

    } 

} 

我沒有帶發現這樣做絲毫的Java 8和收藏家

+1

是的,你寫的軟件做到這一點。在將問題拋給別人解決之前,請投入最少的努力。 –

+0

對不起,我已經做到了。但我想知道是否有使用收集器groupingBy的方法。 –

+1

提供的ValueObject定義不能編譯。 – GuiSim

回答

2

這就是我想出了

List<ValueObject> values = Arrays.asList(new ValueObject(1, 2.0), 
             new ValueObject(2, 2.0), 
             new ValueObject(3, 3.0), 
             new ValueObject(4, 4.0), 
             new ValueObject(5, 4.0), 
             new ValueObject(6, 4.0)); 
Map<Double, IntSummaryStatistics> groupedValues = values.stream() 
                 .collect(Collectors.groupingBy(ValueObject::getValue, 
                         Collectors.summarizingInt(ValueObject::getId))); 

List<GroupedObject> groupedObjects = groupedValues.entrySet() 
                .stream() 
                .map(groupedValue -> new GroupedObject(groupedValue.getValue().getMin(), 
                        groupedValue.getValue().getMax(), 
                        groupedValue.getKey())) 
                .collect(Collectors.toList()); 
System.out.println(groupedObjects); 
的方式

我很有信心,有一種方法可以避免中間人Map<Double, IntSummaryStatistics,但我還沒有想出它y等。如果我這樣做會更新。

編輯:查看@ Tunaki的答案1答案的答案。

這是輸出

[GroupedObject{from=4, to=6, value=4.0}, GroupedObject{from=1, to=2, value=2.0}, GroupedObject{from=3, to=3, value=3.0}] 
+2

有一種方法只進行1次傳遞,但並不是那麼直截了當([請參閱我對相關問題的回答](http://stackoverflow.com/a/36445457/1743880))。最好的是堅持這一點。 – Tunaki

+1

真的很感謝,這是我尋找的一個非常好的方法。我添加了一個排序表達式來依次檢索最終的組。 .sorted(Comparator.comparing(GroupedObject :: GETFROM)) –