如何计算Kotlin的更换时间?

时间:2018-05-31 14:59:33

标签: 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的正则表达式中匹配空格,只是说。

1 个答案:

答案 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
    }