Kotlin 是否有从位置搜索ArrayList的功能?
我仔细阅读了Kotlin中的Kotlin 是否有从位置搜索ArrayList的功能?,kotlin,Kotlin,我仔细阅读了Kotlin中的ArrayList文档,显然无法从指针开始搜索ArrayList中的值。另一种方法是编写自己的函数,在ArrayList中迭代正确的元素并测试条件 因此,我编写了以下代码: fun <T> ArrayList<T>.findNext(cond: (T) -> Boolean, p: Int = 0): Int { for (i in p..this.lastIndex) if (cond(this[i])) r
ArrayList
文档,显然无法从指针开始搜索ArrayList
中的值。另一种方法是编写自己的函数,在ArrayList
中迭代正确的元素并测试条件
因此,我编写了以下代码:
fun <T> ArrayList<T>.findNext(cond: (T) -> Boolean, p: Int = 0): Int {
for (i in p..this.lastIndex)
if (cond(this[i])) return i
return -1
}
data class Person (
var name: String,
var age: Int
)
fun main() {
var v = arrayListOf<Person>()
v.add(Person("Paul", 22))
v.add(Person("Laura", 24))
v.add(Person("Paul", 50))
v.add(Person("Mary", 24))
println(v.findNext({it.name=="Paul"})) // 0
println(v.findNext({it.name=="Paul"}, 1)) // 2
println(v.findNext({it.name=="Paul"}, 3)) // -1
}
fun ArrayList.findNext(条件:(T)->布尔值,p:Int=0:Int{
对于(p.this.lastIndex中的i)
如果(cond(this[i])返回i
返回-1
}
数据类人员(
变量名称:String,
变量年龄:Int
)
主要内容(){
var v=arrayListOf()
v、 加(人(“保罗”,22))
v、 加上(人(“劳拉”,24))
v、 加(人(“保罗”,50))
v、 加(人(“玛丽”,24))
println(v.findNext({it.name==“Paul”}))//0
println(v.findNext({it.name==“Paul”},1))//2
println(v.findNext({it.name==“Paul”},3))/-1
}
还有比这更好的吗 可能与索引和过滤器一起使用
val arrayNames = listOf<String>("Paul", "Ann", "Paul", "Roger","Peter")
arrayNames.withIndex().filter {
it.value == "Paul" //value contains the original name
}.forEach{
println(it.index) //indext contains the position.
}
可能与索引和过滤器一起使用
val arrayNames = listOf<String>("Paul", "Ann", "Paul", "Roger","Peter")
arrayNames.withIndex().filter {
it.value == "Paul" //value contains the original name
}.forEach{
println(it.index) //indext contains the position.
}
fun main(){
var v=arrayListOf()
v、 加(人(“保罗”,22))
v、 加上(人(“劳拉”,24))
v、 加(人(“保罗”,50))
v、 加(人(“玛丽”,24))
println(v.findNext({it.name==“Paul”},0))//IndexedValue(index=0,value=Person(name=Paul,age=22))
println(v.findNext({it.name==“Paul”},2))//IndexedValue(index=2,value=Person(name=Paul,age=50))
println(v.findNext({it.name==“Paul”},3))//null
}
private fun List.findNext(cond:(T)->Boolean,position:Int):IndexedValue?{
返回withIndex().filter{it.index>=position}.firstOrNull{cond(it.value)}
}
fun main(){
var v=arrayListOf()
v、 加(人(“保罗”,22))
v、 加上(人(“劳拉”,24))
v、 加(人(“保罗”,50))
v、 加(人(“玛丽”,24))
println(v.findNext({it.name==“Paul”},0))//IndexedValue(index=0,value=Person(name=Paul,age=22))
println(v.findNext({it.name==“Paul”},2))//IndexedValue(index=2,value=Person(name=Paul,age=50))
println(v.findNext({it.name==“Paul”},3))//null
}
private fun List.findNext(cond:(T)->Boolean,position:Int):IndexedValue?{
返回withIndex().filter{it.index>=position}.firstOrNull{cond(it.value)}
}
您可以避免任何中间集合:
inline fun <T> List<T>.findNext(p: Int = 0, cond: (T) -> Boolean) =
listIterator(p).withIndex().asSequence().find { cond(it.value) }?.let { it.index + p }
您可以避免任何中间集合:
inline fun <T> List<T>.findNext(p: Int = 0, cond: (T) -> Boolean) =
listIterator(p).withIndex().asSequence().find { cond(it.value) }?.let { it.index + p }
有趣的我不知道
withIndex()
。它也可以与数据类一起使用v.withIndex().filter{it.value.name==“Paul”//value包含原始名称}.forEach{println(it.index)//indext包含位置。}}
。我不知道withIndex()
。它也可以与数据类一起使用v.withIndex().filter{it.value.name==“Paul”//value包含原始名称}.forEach{println(it.index)//indext包含位置。}
Nice!它可以调整为返回索引:private fun List.findProx(cond:(T)->Boolean,position:Int=0):Int{return withIndex().filter{it.index>=position}.firstOrNull{cond(it.value)}?.index}
Yes,Int?
将优于IndexedValue?
您可以使用dropWhile
而不是filter
来避免额外的工作。很好!它可以调整为返回索引:private fun List.findProx(cond:(T)->Boolean,position:Int=0):Int{return withIndex().filter{it.index>=position}.firstOrNull{cond(it.value)}?.index}
Yes,Int?
将优于IndexedValue?
您可以使用dropWhile
而不是filter
来避免额外的工作。太好了!有趣的是,运行100000次此方法的速度是答案速度的两倍,但只有问题中代码速度的一半,不够优雅但有效。是的,它仍然需要分配迭代器,进行方法调用,等等。我应该提到你的代码会更快。@PauloBuchsbaum还注意到你的方法和所有答案都可以标记为inline
,以避免额外的分配和cond
参数的间接定向(可能需要交叉内联
):我在做科学编程,所以我使用了大量的内联线
。这是一个很棒的Kotlin
功能。在我的问题中,我更喜欢普通案例,因为它与问题无关。太好了!有趣的是,运行100000次此方法的速度是答案速度的两倍,但只有问题中代码速度的一半,不够优雅但有效。是的,它仍然需要分配迭代器,进行方法调用,等等。我应该提到你的代码会更快。@PauloBuchsbaum还注意到你的方法和所有答案都可以标记为inline
,以避免额外的分配和cond
参数的间接定向(可能需要交叉内联
):我在做科学编程,所以我使用了大量的内联线
。这是一个很棒的Kotlin
功能。在我的问题中,我更喜欢简单的情况,因为它与问题无关。
println(v.findNext {it.name=="Paul"}) // 0
println(v.findNext(1) {it.name=="Paul"}) // 2
println(v.findNext(3) {it.name=="Paul"}) // null