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]]
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]]
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
}
Đố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
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
@ mfulton26 cảm ơn thông báo, đã cập nhật câu trả lời cho phù hợp. – miensol
API nói rằng có một chức năng groupby, mà nên làm những gì bạn muốn.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html
Hoặc sử dụng sublist và phá vỡ nó lên bản thân
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/sub-list.html
Kể từ Kotlin 1.2 bạn có thể sử dụng chức năng Iterable<T>.chunked(size: Int): List<List<T>>
từ stdlib (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html).
đó 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
Có thể trùng lặp: http://stackoverflow.com/q/ 34498368/3255152 – mfulton26
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