代码之家  ›  专栏  ›  技术社区  ›  theblitz

科特林代码-FlatMap在这里是如何工作的?

  •  0
  • theblitz  · 技术社区  · 5 年前

    下面是来自LeetCode解决方案的代码。

    这是描述:

    Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.
    
    Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even.
    

    我设法写了一些有用的代码,但我的代码几乎和Java一样,只是用了Kotlin(我知道一个常见的问题)。

    我在评论中找到了这个代码:

       fun sortArrayByParityII(A: IntArray): IntArray {
            val even = A.filter { it % 2 == 0 }
            val odd = A.filter { it % 2 == 1 }
            return even.zip(odd).flatMap { listOf(it.first, it.second) }.toIntArray()
        }
    

    我知道前几行是这样的。他们简单地将数组过滤成奇偶数组。 我甚至(在查过之后)明白“拉链”的作用。

    我不明白这是怎么回事:

    flatMap { listOf(it.first, it.second) }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Andrei Tanana    5 年前

    让我们一步一步看:

    fun main() {
        val list = (1..10).toList()
        val even = list.filter { it % 2 == 0 } // [2, 4, 6, 8, 10]
        val odd = list.filter { it % 2 == 1 } // [1, 3, 5, 7, 9]
        val zipped = even.zip(odd) // [(2, 1), (4, 3), (6, 5), (8, 7), (10, 9)]
        val flatten = zipped.flatMap { listOf(it.first, it.second) } // [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
    }
    

    flatMap 获取一个函数,该函数返回一个列表并将此列表的元素插入到初始列表中。所以 [(2, 1), (4, 3)] 变成 [2, 1, 4, 3]

        2
  •  0
  •   CodeRanger    5 年前

    给定筛选列表:

    odd = [1,3,5,7,9,...]
    even = [2,4,6,8,...] 
    

    zip函数将每个列表中的每个项连接到元组列表中:

    even.zip(odd)
    // [(2,1),(4,3),(6,5),(8,7),...]
    

    平面映射在这里对每个项(元组)执行操作并返回单个列表,它在每个元组中先选择第二个项,然后将它们添加到单个列表中:

    even.zip(add).flatMap { listOf(it.first, it.second) }
    // [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]