如何在 kotlin 中组合两个不同长度的列表?

Bah*_*duk 6 java android kotlin kotlin-android-extensions

我想合并两个不同长度的列表。例如;

val list1 = listOf(1,2,3,4,5)
val list2 = listOf("a","b","c")
Run Code Online (Sandbox Code Playgroud)

我想要这样的结果

(1,"a",2,"b",3,"c",4,5)
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Eug*_*nko 6

您可以.zip为此使用该功能

list1.zip(list2){ a,b -> listOf(a,b)}.flatten()
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它只会处理两个集合的元素,所以如果(就像在例子中一样)让我们有不同的大小 - 它不会工作

另一种方法是添加特定标记并过滤它们,或者仅使用迭代器。我找到了一个具有sequence{..}功能的优雅解决方案

 val result = sequence {
    val first = list1.iterator()
    val second = list2.iterator()
    while (first.hasNext() && second.hasNext()) {
      yield(first.next())
      yield(second.next())
    }

    yieldAll(first)
    yieldAll(second)
  }.toList()
Run Code Online (Sandbox Code Playgroud)


Ven*_*ath 6

  1. 如果源列表中的元素可以以任意顺序出现在结果列表中,则
>>> list1 + list2
res12: kotlin.collections.List<kotlin.Any> = [1, 2, 3, 4, 5, a, b, c]
Run Code Online (Sandbox Code Playgroud)
  1. 如果源列表中的元素应在结果列表中交替出现,并且 list1 比 list2 长,则
>>> list1.zip(list2).flatMap { listOf(it.first, it.second) } + list1.drop(list2.size)
res16: kotlin.collections.List<kotlin.Any> = [1, a, 2, b, 3, c, 4, 5]
Run Code Online (Sandbox Code Playgroud)