Kotlin 是否像 Rust 和 Swift 一样支持通过引用进行字符串/数组切片?

问题描述 投票:0回答:1

RustSwift 中,您可以创建一个数组和字符串的切片,它不会创建元素的新副本,而是使用范围或迭代器为您提供现有元素的视图,并在内部实现为参考对或参考+长度。

Kotlin 有类似的概念吗?它似乎有一个类似的列表概念

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

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

arrays string kotlin slice
1个回答
2
投票

我不这么认为。

您可以使用

asList
以列表形式获取数组视图。然后您已经找到的功能
subList
就可以正常工作了。但是,我不知道
subList
相当于
Array
。从
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 中首选使用列表(或集合),并且比数组对泛型和不变性有更好的支持。

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

IntRange

© www.soinside.com 2019 - 2024. All rights reserved.