【问题标题】:Two accumulators in reduce / fold减少/折叠中的两个累加器
【发布时间】:2022-01-08 19:37:18
【问题描述】:

假设我有一个数据列表val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10"),我想对每个元素执行给定的逻辑。

我必须在外面添加var acc2 = 0 才能做到这一点。我想知道有没有可能让两个累加器折叠/减少这种方法没有副作用。

val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10")
var acc2 = 0
val result = data.fold(0, { acc, str ->
    when (str.split(" ")[0]) {
        "F" -> {
            acc + str.split(" ")[1].toInt() * acc2
        }
        "D" -> {
            acc2 += str.split(" ")[1].toInt()
            acc
        }
        "U" -> {
            acc2 -= str.split(" ")[1].toInt()
            acc
        }
        else -> {
            acc
        }
    }
})

【问题讨论】:

  • 只使用一对元组或其他复合累加器?
  • @Endzeit 正在讨论这个标记on Meta
  • 你有没有机会adventofcode.com/2021/day/2? :P
  • 你说得对,我正在参与“代码的出现”,我已经解决了第 2 天,但我的解决方案并不如我所愿;)

标签: kotlin functional-programming


【解决方案1】:

您可以使用一个简单的对象,包装两个值。

data class Position(var horizontal: Int, var depth: Int)

val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10")

val result = data.fold(Position(0, 0)) { position, str ->
    val (command, value) = str.split(" ")

    when (command) {
        "F" -> position.horizontal += value.toInt()
        "D" -> position.depth += value.toInt()
        "U" -> position.depth -= value.toInt()
    }

    position
}

如果您不想为此创建新类,可以使用 Kotlin 标准库中的 Pair<Int, Int> 类。

【讨论】:

    【解决方案2】:

    感谢上面的 cmets,我尝试在我的解决方案中使用 Pair

    val result = data.fold(Pair(0, 0), { accs, str ->
        val (command, value) = str.split(" ")
        when (command) {
            "F" -> Pair(accs.first + value.toInt() * accs.second, accs.second)
            "D" -> Pair(accs.first, accs.second + value.toInt())
            "U" -> Pair(accs.first, accs.second - value.toInt())
            else -> accs
         }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 2013-12-27
      • 2012-02-21
      • 1970-01-01
      • 2011-12-05
      相关资源
      最近更新 更多