2017-06-18 167 views
0

我有一個類Accumulation像下面過濾列表

public class Accumulation implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private String mobileNo; 
    private String address; 
    private int count; 

    -- 
    getter 
    setter 
} 

我通過

List<Accumulation> accumulations = repository.getAccumulation(); 

從我的存儲庫中獲得數據現在爲例List<Accumulation>積累包含5個記錄。

First records : 123, Test1, 2 
Second records : 123, Test1, 2 
Third records : 123, Test1, 2 
Fourth records : 123, Test1, 1 
Fifth records : 123, Test1, 2 

我們可以通過下面的代碼得到總數。

int totalCount = accumulations.stream().mapToInt(Accumulation::getCount).sum(); 

因此,從上述列表中,我們可以得到總數爲:: 9

什麼,我想:我想只得到8計數的記錄。

例如:如果我們只得到4條記錄(第一,第二,第三,第五條),那麼我們可以得到8個計數。

如何實現上述邏輯?我找不到任何東西。

+0

你試圖讓,使計8種元素的子表? (如果我理解正確)。你應該清楚地解決它。 –

+0

@ShafinMahmud正確 –

+0

你的目標是什麼?獲取沒有最後一個元素的列表或根據指定記錄計數獲取列表? – ledniov

回答

1

如果你期待的名單要短,你可以brute-強制搜索累積的所有組合。下面的代碼片段利用BitSet類的避免做人工操縱掩碼:

import static java.util.stream.Collectors.toList; 

Optional<List<Accumulation>> result = LongStream.range(0, 1L << accumulations.size()) 
    .mapToObj(bits -> BitSet.valueOf(new long[] {bits})) 
    .filter(bits -> 8 == bits.stream() 
      .map(i -> accumulations.get(i).getCount()) 
      .sum() 
    ) 
    .map(bits -> bits.stream() 
      .mapToObj(accumulations::get) 
      .collect(toList()) 
    ) 
    .findFirst(); 
0

如果你想要得到的返回列表的子可以用List.subList

爲了得到8個元素:

ListItems.subList(0, 8); 
+1

我認爲他沒有要求8個元素。他要求提供計數的元素子列表8.所以這不是正確答案 –

+0

@ShafinMahmud Correct –