首页 > 解决方案 > 如何计算 Kotlin 中的替换次数?

问题描述

这是我正在做的事情:

val a = listOf("foo bar", "foo bar baz", "bar", "bar")
val b = a.count {it.contains("bar")}
val aa = a.map { it.replace("bar", "baz") }
var c = aa.count {it.contains("bar")}
println("replaced: ${b-c}")

似乎效率不高。

顺便说一句,我刚刚发现我无法轻松匹配 Java/Kotlin 正则表达式中的空格,只是说。

标签: kotlin

解决方案


好的,这是一个建议:partition您的列表包含包含“bar”的元素和不包含“bar”的元素。取第一个集合并替换相应的元素(也计算它们),然后添加回其他元素(不包含“bar”)。

val a = listOf("foo bar", "foo bar baz", "bar", "bar")
var replaced = 0
val replacedList = a.partition { it.contains("bar") }.let {
    it.first.map { it.replace("bar", "baz") }.also { replaced = it.size } +
            it.second
}
println(replaced) //4
println(replacedList) //[foo baz, foo baz baz, baz, baz]

这是做什么的partition

inline fun <T> Iterable<T>.partition(
    predicate: (T) -> Boolean
): Pair<List<T>, List<T>> (source)

将原始集合拆分为一对列表,其中第一个列表包含谓词为真的元素,而第二个列表包含谓词为假的元素。

编辑:

如果要计算“bar”的出现总数而不是包含“bar”的字符串的数量,则可以使用以下方法(使用空白作为唯一允许的分隔符):

val replacedList = a.partition { it.contains("bar") }.let { partitions ->
        partitions.first.map { it.replace("bar", "baz") }.also {
            replaced = partitions.first.flatMap { it.split(" ") }.count { it.contains("bar") }
        } + partitions.second
    }

推荐阅读