这是我正在做的事情:
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的正则表达式中匹配空格,只是说。答案 0 :(得分:1)
好的,这里有一个建议: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)
将原始集合拆分为一对列表,其中第一个列表 包含谓词产生true的元素,而第二个列表 包含谓词产生错误的元素。
编辑:
如果要计算“bar”的出现次数而不是包含“bar”的字符串数,则以下方法可行(空白为唯一允许的sparator):
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
}