Kotlin学习 – 删去字符串中的元音

Situation(背景)

1119. 删去字符串中的元音

Target(目标)

完成题目,输出解题思路。

Action(行动/做法)

题解

非常简单的题目,就是一个过滤的事情,使用Kotlin的filter函数解决。

class Solution {
    fun removeVowels(s: String): String {
        return s.filter{
            it != 'a' && it != 'e' && it != 'i' && it != 'o' && it != 'u'
        }
    }
}
复制代码

分析

题目本身没什么好说的,但可以分析下filter源码本身。

public inline fun String.filter(predicate: (Char) -> Boolean): String {
    return filterTo(StringBuilder(), predicate).toString()
}
复制代码

可以看到filterString的一个扩展函数,其入参数是一个函数(入参Char,返回Boolean),函数本身返回String
基于带有接收者的函数字面值描述,这还是一个能在{}体里,直接用this访问调用者的函数,那么其本质调用如下:

public inline fun String.filter(predicate: (Char) -> Boolean): String {
    return this.filterTo(StringBuilder(), predicate).toString()
}
复制代码

先继续看filterTo

public inline fun <C : Appendable> CharSequence.filterTo(destination: C, predicate: (Char) -> Boolean): C {
    for (index in 0 until length) {
        val element = get(index)
        if (predicate(element)) destination.append(element)
    }
    return destination
}
复制代码

一样的道理,里面省略了很多调用者的描述this,也就是前面filter的调用者String对象。
接着会根据predicate来过滤元素,最终返回filter里的StringBuilder()

不难看出,filter是没做字符串拼接的,所以性能上也没有问题。

Result(结果)

完成题目,总结:
题目本身很简单,但kotlin本身对特殊用法还是很方便的。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享