如何在Kotlin中获得Python的切片操作符

2024-09-29 23:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

Python有一个slice操作符,我想要它在Kotlin中。在

我要用Kotlin编写以下代码

val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
println(
        list[5]
)
println(
        list[2, 5].joinToString()
)
println(
        list[2, 10, 2].joinToString()
)
val mutableList = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
mutableList[2, 10, 2] = listOf(1, 2, 3, 4)
println(
        mutableList.joinToString()
)

输出以下内容:

^{pr2}$

但这不管用!在


Tags: 代码slicevallistprintlnkotlinpr2listof
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:43

这可以通过使用扩展函数和运算符重载来实现。下面的代码将解决您提供的问题。经过一些调整,它也可以处理Python提供的所有其他选项。在

operator fun <T : Any> Iterable<T>.get(start: Int, end: Int, step: Int = 1): Iterable<T> {
    check(start < end)
    check(step > 0)
    val iterator = iterator()
    var s = 0
    return generateSequence {
        while (s < start && iterator.hasNext()) {
            iterator.next()
            s++
        }
        if (iterator.hasNext()) {
            if (s < end) {
                val value = iterator.next()
                repeat(step - 1) { s++; if (iterator.hasNext()) iterator.next() }
                s++
                value
            } else {
                null
            }
        } else {
            null
        }
    }.asIterable<T>()
}

operator fun <T : Any> MutableList<T>.set(start: Int, end: Int, step: Int = 1, newElts: Iterable<T>) {
    check(start < end)
    check(step > 0)
    val iterator = iterator()
    val newIterator = newElts.iterator()
    var s = 0
    while (s < start && iterator.hasNext()) {
        iterator.next()
        s++
    }
    while (iterator.hasNext()) {
        if (s < end) {
            if (newIterator.hasNext()) {
                this[s] = newIterator.next()
                iterator.next()
                repeat(step - 1) {
                    s++;
                    if (iterator.hasNext())
                        iterator.next()
                    else
                        return
                }
                s++
            } else
                return
        }
    }
}

reddit上的gladed想出了另一个不使用Python语法的解决方案,但我很喜欢。在

^{pr2}$

相关问题 更多 >

    热门问题