如何在 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&lt;AA&gt;):

 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&lt;AA&gt; @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&lt;Any&gt;,然后在also 块中创建BBaddAll 项。可能有一种更优雅的方法可以做到这一点,但这是我首先想到的。

在这里简单使用flatten是行不通的,因为AA没有实现iterable

【讨论】:

【参考方案3】:

你可以试试这个:

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

【讨论】:

以上是关于如何在 Kotlin 中展平列表列表?的主要内容,如果未能解决你的问题,请参考以下文章

在Prolog中展平列表

在Python中展平列表(任意深度)

python 在Python中展平列表。 #蟒蛇

Prolog中的展平列表[重复]

我们如何在不使用 recyclerview 的情况下创建水平列表视图?

在垂直列表视图中添加水平列表视图时不正确使用 ParentDataWidget