Kotlin 是否有从位置搜索ArrayList的功能?

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

我仔细阅读了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]))  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