簡體   English   中英

如何在 Kotlin 中展平列表列表?

[英]How to flatten List of Lists in Kotlin?

我有一個 AA 類對象列表,其中包含一個日期和一個 BB 類對象列表:

data class AA(
    val date: LocalDate,
    val bb: List<BB>
)

@Parcelize
data class BB(
    val x: Int,
    val y: String,
    val z: String
) : Parcelable

我想創建一個如下所示的列表(展平List<AA> ):

 listOf(
    date obj
    BB obj
    BB obj
    date obj
    BB obj
    date obj
    BB obj
    BB obj 
    BB obj)

代替:

 listOf(
    date obj, listOf(BB obj, BB obj)
    date obj, listOf(BB obj)
    date obj, listOf(BB obj, BB obj, BB obj))

我嘗試使用 flatMap,但我只設法壓平了一個部分 - BB。
如何創建包含日期和 BB 項目的列表?

我所知道的最簡單的方法是將flatten()函數擴展到Iterable 由於List是后者的子類,所以適用。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/flatten.html

val deepList = listOf(listOf(1), listOf(2, 3), listOf(4, 5, 6))
println(deepList.flatten()) // [1, 2, 3, 4, 5, 6]

正如@DYS所回答的那樣,您可以並且應該使用flatten來展平列表。 我的回答涵蓋了如何實現問題中所述的特殊情況。

你可以這樣做:

val a = listOf(
    AA(LocalDate.now(), listOf(BB(1, "1", "1")))
)
val flattened = a.flatMap { aa -> mutableListOf<Any>(aa.date).also { it.addAll(aa.bb) }}

查看完整示例

基本上你使用flatMap ,用date創建一個MutableList<Any> ,然后在also塊中addAll BB項目。 可能有一種更優雅的方法來做到這一點,但這是我首先想到的。

簡單地使用flatten在這里不起作用,因為 AA 沒有實現iterable

你可以簡單地試試這個:

fun flatten(list: List<List<Any>>?) = list?.flatten() ?: emptyList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM