减少/折叠中的两个累加器
Two accumulators in reduce / fold
假设我有一个数据列表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
}
}
})
您可以使用一个简单的对象,包装两个值。
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
}
如果您不想为此创建一个新的 class,您可以使用 Kotlin 标准库中的 class Pair<Int, Int>
。
感谢以上评论,我尝试在我的解决方案中使用 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
}
})
假设我有一个数据列表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
}
}
})
您可以使用一个简单的对象,包装两个值。
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
}
如果您不想为此创建一个新的 class,您可以使用 Kotlin 标准库中的 class Pair<Int, Int>
。
感谢以上评论,我尝试在我的解决方案中使用 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
}
})