kotlin - 如何计算 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 正则表达式中的空格,只是说。
解决方案
好的,这是一个建议: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
}
推荐阅读
- python - 如何解决 Python 中 `len` 函数的限制?
- php - 如何在同一个 Symfony v2.8 项目的不同控制器中调用所需文件中的函数?
- gcc - 使用 arm-none-eabi-gcc 的 isprint() 的奇怪错误消息
- google-maps - google_maps_flutter 出现问题,标记 onTap(){} 不起作用
- c++ - 如何使框架图案宽度行、列和厚度输入?
- django - 将主页视图链接到其他视图
- python - 如何使用python移动名称中带有空格的多个文件?
- javascript - 在 JavaScript 中将非纯函数转换为纯函数的策略是什么
- javascript - 如何在我的脚本标签中编写 HTML 代码?
- javascript - 这个脚本有什么办法可以在 texstudio 中工作吗?