首页 > 解决方案 > Kotlin 是否支持像 Rust 和 Swift 这样的引用字符串/数组切片?

问题描述

RustSwift中,你可以创建一个数组和字符串的切片,它不会创建元素的新副本,但可以使用范围或迭代器查看现有元素,并在内部实现引用对或引用 +长度。

Kotlin 有类似的概念吗?list似乎有类似的概念。

谷歌很难,因为有一个名为“ slice ”的函数似乎可以复制元素。我是不是全都弄错了,还是丢失了?

(我知道我可以轻松解决它。顺便说一句,我没有 Java 背景。)

标签: arraysstringkotlinslice

解决方案


我不这么认为。

您可以使用asList以列表形式获取 Array 的视图。然后您已经找到的功能subList照常工作。但是,我不知道subListfor Arrays 的等价物。从返回的列表asList是不可变的,因此您不能使用它来修改数组。如果您尝试通过 使列表可变toMutableList,它只会创建一个新副本。

fun main() {
    val alphabet = CharArray(26) { 'a' + it }
    println(alphabet.joinToString(", "))

    val listView = alphabet.asList().subList(10, 15)
    println(listView)

    for (i in alphabet.indices) alphabet[i] = alphabet[i].toUpperCase()
    println(alphabet.joinToString(", "))
    // listView is also updated
    println(listView)
}

输出:

a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
[k, l, m, n, o]
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
[K, L, M, N, O]

在 Kotlin 中首选使用列表(或Collections),并且与数组相比,它对泛型和不变性的支持要好得多。

如果您需要改变数组,您可能必须自己管理它,传递(对)数组和IntRange您关心的索引的一个(引用)。


推荐阅读