2015-06-23 26 views
8

Có thể phân vùng Danh sách trong Jdk8 thuần túy thành các phần bằng nhau (danh sách con) hay không.Danh sách phân vùng Java 8

Tôi biết có thể sử dụng lớp ổi Lists, nhưng chúng ta có thể làm điều đó với Jdk thuần túy không? Tôi không muốn thêm các lọ mới vào dự án của tôi, chỉ cho một trường hợp sử dụng.

SOLUTONS:

Giải pháp tốt nhất cho đến bây giờ đã được trình bày bởi tagir-valeev:

Tôi cũng đã tìm thấy three other possibilities, nhưng họ ment cho chỉ vài trường hợp:

1.Collectors.partitioningBy() để chia danh sách thành 2 danh sách con - như sau:

intList.stream().collect(Collectors.partitioningBy(s -> s > 6)); 
    List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values()); 

2.Collectors.groupingBy() để chia danh sách của chúng tôi đến nhiều phân vùng:

Map<Integer, List<Integer>> groups = 
     intList.stream().collect(Collectors.groupingBy(s -> (s - 1)/3)); 
    List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values()); 

3.Split bởi separator:

List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8); 

    int[] indexes = 
     Stream.of(IntStream.of(-1), IntStream.range(0, intList.size()) 
     .filter(i -> intList.get(i) == 0), IntStream.of(intList.size())) 
     .flatMapToInt(s -> s).toArray(); 
    List<List<Integer>> subSets = 
     IntStream.range(0, indexes.length - 1) 
       .mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1])) 
       .collect(Collectors.toList()); 
+0

Bạn có thể xem xét mã nguồn của ổi và làm tương ứng ...? –

+0

Việc viết một hàm trong java thuần túy không phải là vấn đề, nhưng JDK8 có một số tính năng tuyệt vời với tính năng truyền trực tuyến và hoạt động trên các bộ sưu tập, và tôi cho rằng nó sẽ nhanh hơn viết mã riêng. Nhưng đó chỉ là giả định của tôi. – Beri

+0

Tôi đánh dấu nó là có thể trùng lặp như giải pháp Java-8 cũng có sẵn ở đó. –

Trả lời

11

Điều đó có thể được thực hiện dễ dàng bằng cách sử dụng phương pháp subList():

List<String> collection = new ArrayList(21); 
// fill collection 
int chunkSize = 10; 
List<List<String>> lists = new ArrayList<>(); 
for (int i=0; i<collection.size(); i+= chunkSize) { 
    int end = Math.min(collection.size(), i + chunkSize); 
    lists.add(collection.subList(i, end)); 
} 
Các vấn đề liên quan