如何在 Kotlin 中展平列表列表?
Posted
技术标签:
【中文标题】如何在 Kotlin 中展平列表列表?【英文标题】:How to flatten List of Lists in Kotlin? 【发布时间】:2019-12-12 21:01:36 【问题描述】:我有一个 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 项目的列表?
【问题讨论】:
Divide elements on groups in RecyclerView or Grouping Recyclerview items ,say by date的可能重复 @Hardik Chauhan - 我的问题是如何展平列表。 RecyclerView 将用于它并且不相关(我将其删除)。无论如何,答案是关于分组的。我需要代表现有的对象。所以这不是一个重复的问题! 扁平化列表中的item
是什么?它似乎没有出现在List<AA>
@leonardkraemer - 基本上如果我的 List 看起来像这样: listOf((date1,listOf(2,a,b), (date2,listOf((3,v,d),( 5,c,j))) 等然后我想要一个列表:listOf(date1,(2,a,b),date2,(3,v,d),(5,c,j))
我进行了编辑以使其更清晰
【参考方案1】:
我知道的最简单的一个是将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]
【讨论】:
您也可以这样做:listOf(1) + listOf(2,3) + listOf(4,5,6)
(它是:listOf(1).plus(listOf(2,3)).plus(listOf(4,5,6))
的简写)以获得相同的结果。【参考方案2】:
正如@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)
见complete example
基本上,您使用flatMap
,使用date
创建一个MutableList<Any>
,然后在also
块中创建BB
的addAll
项。可能有一种更优雅的方法可以做到这一点,但这是我首先想到的。
在这里简单使用flatten
是行不通的,因为AA没有实现iterable
。
【讨论】:
【参考方案3】:你可以试试这个:
fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()
【讨论】:
以上是关于如何在 Kotlin 中展平列表列表?的主要内容,如果未能解决你的问题,请参考以下文章