在Kotlin中如何将嵌套的列表压平?

31

我有一个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项目的列表?

我尝试使用flatMap,但只能压平其中的一部分 - BB。
如何创建一个包含日期和BB项目的列表?


@Hardik Chauhan - 我的问题是如何展开列表。RecyclerView 是将要使用的,但并不相关(我已经删除了它)。无论如何,那里的答案是关于分组的。我需要表示现有的对象。所以这不是一个重复的问题! - user990635
在扁平化列表中,“item”是什么?它似乎没有出现在“List<AA>”中。 - leonardkraemer
@leonardkraemer - 基本上,如果我的List<AA>看起来像这样: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)) - user990635
我进行了编辑以使其更加清晰。 - user990635
5个回答

39

2
你也可以这样做:listOf(1) + listOf(2,3) + listOf(4,5,6)(这是 listOf(1).plus(listOf(2,3)).plus(listOf(4,5,6)) 的简写形式)以获得相同的结果。 - cs_pupil
正如您所看到的,OP对嵌套列表有不同的类型。这与问题有什么关系,为什么人们还在投赞成票呢? - Farid
@Farid 我认为这个问题更强调的是将列表中的列表展平,而不是像问题标题所暗示的那样是不同类型的列表。 - DYS
@DYS 如果你只回答标题的问题,那就没什么可说的了。问题的内容存在是有原因的,对吧?如果人们只看标题并据此回答,那么你会得到多么模糊的答案啊。 - Farid

21

正如@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,创建一个带有dateMutableList<Any>,然后在also块中使用addAll添加BB项。可能有更优雅的方法来解决它,但我首先想到了这个方法。

简单地使用flatten在这里不起作用,因为AA没有实现iterable接口。


1
你可以简单地尝试这个:
fun flattenNestedList(list: List<List<Any>>?) = list?.flatten() ?: emptyList()

正如您所看到的,OP对于嵌套列表有不同的类型。 - Farid

0

我发现最好的列表平铺方法是:

val flatList = listOf<String>("A", "B", *listOf("C", "D").toTypedArray())

0

几年后,这里有一些简单的例子:

使用列表嵌套列表

val array = listOf(listOf("a", "b"), listOf("c", "b"))
.flatten().toTypedArray()

使用数组的数组

val array = arrayOf(arrayOf("a", "b"), arrayOf("c", "b"))
.flatten().toTypedArray()

使用数组列表

val array = listOf(arrayOf("a", "b"), arrayOf("c", "b"))
.flatMap { it.toList() }.toTypedArray()

希望能帮助到某人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接