【问题标题】:Kotlin functional programming keep reference of previous object in ListKotlin 函数式编程保持对 List 中前一个对象的引用
【发布时间】:2021-12-29 01:59:53
【问题描述】:

我有一个 Person 对象列表,这些对象与配偶关系按照它们在列表中出现的顺序相互关联。

enum class Gender {
    MAN, WOMAN
}
data class Person(val name: String, val age: Int, val gender: Gender)

在列表中,每个具有 MAN 性别的人都是以下具有 WOMAN 性别的人的配偶(反之亦然),并且列表中的每个条目后面都是交替的性别,其中 MAN 性别是第一个。

理想情况下,该列表应类似于[MAN, WOMAN, MAN, WOMAN, MAN, WOMAN](显然,为了简单起见,它将是一个 Person 对象的列表,我在这里放了一个 Gender 列表),但它也可能类似于 [WOMAN, MAN, WOMAN, MAN, WOMAN, MAN]。在后一种情况下,第一个出现的 WOMAN 是最后一个出现的 MAN 的配偶。

如何使用函数式编程在 kotlin 中处理第二种情况。 我目前的方法包括检查第一个 Person 是否有性别女性,然后我删除列表中的第一个和最后一个对象,然后将它们添加到最后,但这并不完全是一个函数式编程解决方案。

有人可以指导我吗?

谢谢

【问题讨论】:

    标签: kotlin functional-programming


    【解决方案1】:

    全功能方法是什么意思?
    与您提到的类似,您可以通过如下简单语句来修复订单:

    val correctList = if(list.first().gender == MAN) list else list.drop(1) + list.first()
    

    【讨论】:

    • 是的,我想,你是对的,我的想法是正确的,但没有按照你解释的方式实施。谢谢
    【解决方案2】:

    如果你想要更通用的方法,你可以这样做:

        // separate the people into a list of gender=MAN and a list of everyone else
        // the result is a Pair, so I'm destructuring that into two variables
        val (men, women) = people.partition { it.gender == MAN }
        // use zip to take a person from each list and combine them into a list of pairs
        men.zip(women)
        // use flatMap to turn each pair into a list of two people
        // just using map would create a list of lists, flatMap flattens that into
        // a single list of people, alternating gender=MAN, gender=WOMAN 
           .flatMap { it.toList() }
    

    这样,原始列表的排序方式无关紧要,它可以从任何元素开始,并且您可以完全混合不同的类型 - BABBAABA 仍然会以 ABABABAB 出现。因此,这是一种组合混合数据流的通用方法 - partition 将它们分成组,zip 允许您从每个组中提取一个元素并对其进行处理。

    在这里,我只是让zip 创建Pairs,然后flatMap 将它们转回有序列表(如果这是您想要的)。你也可以在每一对上做一个forEach(比如,如果你想在每个Person上设置一个值以将它们相互链接),或者zip也可以使用一个转换函数。

    当其中一个列表用完时,zip 也会终止(例如,AAABB 你会得到两对)所以这适用于生成完整的元素对 - 如果你还需要处理没有一个“合作伙伴”,你需要做更多的工作

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2021-01-17
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2015-06-14
      • 2020-09-08
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多