【问题标题】:How to flatten List of Lists in Kotlin?如何在 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 项目的列表?

【问题讨论】:

  • @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))
  • 我进行了编辑以使其更清晰

标签: android list kotlin android-recyclerview flatmap


【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2016-09-07
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      相关资源
      最近更新 更多