2016-11-19 18 views
5

Có cách nào đơn giản để chia danh sách thành các phần (có thể một số lambda) trong Kotlin không?Chia danh sách thành các phần

Ví dụ:

[1, 2, 3, 4, 5, 6] => [[1, 2], [3, 4], [5, 6]] 
+1

đó là tính năng được yêu cầu cho Kotlin 1.1: https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/window-sliding.md – succcubbus

+0

Có thể trùng lặp: http://stackoverflow.com/q/ 34498368/3255152 – mfulton26

+2

Nếu bạn muốn phân vùng thành các phần _two_, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/partition.html sẽ làm những gì bạn muốn làm. ví dụ. 'list.partition {x -> x <4}' – carpeliam

Trả lời

10

Với danh sách: val list = listOf(1, 2, 3, 4, 5, 6) bạn có thể sử dụng groupBy:

list.groupBy { (it + 1)/2 }.map { it.value } 

Hoặc nếu giá trị của bạn không phải là số trước tiên bạn có thể chỉ định một chỉ mục cho họ:

list.withIndex() 
    .groupBy { it.index/2 } 
    .map { it.value.map { it.value } } 

Hoặc nếu bạn muốn tiết kiệm một số phân bổ bạn có thể đi thêm một chút cách thủ công với foldIndexed:

list.foldIndexed(ArrayList<ArrayList<Int>>(list.size/2)) { index, acc, item -> 
    if (index % 2 == 0) { 
     acc.add(ArrayList(2)) 
    } 
    acc.last().add(item) 
    acc 
} 
+1

Đối với ['groupBy'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html)," the bản đồ được trả về giữ lại thứ tự lặp lại của các khóa được tạo ra từ bộ sưu tập gốc. " Như vậy, ví dụ đầu tiên của bạn có thể được đơn giản hóa thành 'list.groupBy {(it + 1)/2} .values'. – mfulton26

+0

Kotlin có ['withIndex'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/with-index.html) có thể làm cho ví dụ thứ hai của bạn dễ đọc hơn một chút:' list .withIndex(). groupBy {it.index/2} .values.map {it.map {it.value}} '. – mfulton26

+0

@ mfulton26 cảm ơn thông báo, đã cập nhật câu trả lời cho phù hợp. – miensol

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