我有个关于跑步功能的问题。
我完全理解最后的'eachCount()‘结果,但是运行函数给了我一点印象。
它是如何工作的?
id_list:"muzi","frodo",“A桃”,"neo“
报告:“木子佛罗多”、“水蜜桃蛙”、“佛罗多新”、“木子新”、“阿桃木子”
k: 2
答: 2,1,1,0
class Solution {
fun solution(id_list: Array<String>, report: Array<String>, k: Int): IntArray =
report.map { it.split(" ") }// [[muzi, frodo], [apeach, frodo], [frodo, neo], [muzi, neo], [apeach, muzi]]
.groupBy { it[1] }// {frodo=[[muzi, frodo], [apeach, frodo]], neo=[[frodo, neo], [muzi, neo]], muzi=[[apeach, muzi]]}
.asSequence()
.map { it.value.distinct() }//[[[muzi, frodo], [apeach, frodo]], [[frodo, neo], [muzi, neo]], [[apeach, muzi]]]
.filter { it.size >= k }// [[[muzi, frodo], [apeach, frodo]], [[frodo, neo], [muzi, neo]]]
.flatten()// [[muzi, frodo], [apeach, frodo], [frodo, neo], [muzi, neo]]
.map { it[0] }//[muzi, apeach, frodo, muzi]
.groupingBy { it }
.eachCount()// {muzi=2, apeach=1, frodo=1} -> run function's reciver object??
.run { id_list.map { getOrDefault(it, 0)}.toIntArray() } -> I don`t know how it works.}
发布于 2022-08-03 22:06:29
thing.run将您放在thing的作用域中,就好像您正在其类中运行代码一样,而在函数块中,this是thing。通常这是为了方便起见,所以您不必一直显式地引用对象:
// also useful for null-checking stuff before you try to do things with it!
thing?.run {
doThing()
println(someProperty)
}let是类似的,但是它不是在成为接收者时调用的对象(函数中的this),而是作为参数传入:
thing?.let {
// now you have to explicitly refer to the parameter
it.doThing()
println(it.someProperty)
}有一些类似的接收器/参数作用域函数,它们做类似的事情,比如apply/also。你选哪一个取决于什么是最有意义的。如果您使用对象作为参数来调用对象,那么调用doThing(it) (或者重命名的参数,读起来更好!)可能更正确!比doThing(this)
代码中最重要的一点是,最后一行使用run 和 let。这允许它引用链中那个阶段的两个不同的对象--这是之前发生的所有事情的结果( run调用了它,因此它变成了接收方,this)和map调用it中的当前项。
你基本上是在调用所有的东西,并产生一个Map。然后调用run,它将将该Map转换为另一个值,并允许您通过this访问Map。然后,通过在map上调用id_list并通过this.getOrDefault对Map进行查找(可以将其缩短为getOrDefault),从而生成要输出的值。
它基本上相当于:
val myMap = // big chain of operations
val lookup = id_list.map { myMap.getOrDefault(it, 0) }.toIntArray()
return lookup只有run作为大链的一部分工作,将一个值转换为另一个值,而不声明中间变量。
顺便说一句,如果需要,可以使用let,因此涉及两个参数-一个来自let函数,一个来自map函数:
// giving it a name because you can't have two things called 'it'
.let { myMap -> id_list.map { myMap.getOrDefault(it, 0)}.toIntArray() }但这可能不是个进步,对吧?不过,如果你想这样做,或者想要更明确的话,你也可以这么做!(能够命名参数是准确记录正在发生的事情的一种很好的方式-可能不清楚您所调用的run或let实际上是什么,而且名称可以帮助您)
发布于 2022-08-03 16:11:52
最后一行相当于
.run { id_list.map { this.getOrDefault(it, 0) }.toIntArray() } 其中this是.eachCount()在上一行返回的映射,it是id_list的每个元素。
https://stackoverflow.com/questions/73223958
复制相似问题