Kotlin 是否像 Rust 和 Swift 一样通过引用支持 string/array 切片?
Does Kotlin support string/array slices by reference like Rust and Swift?
在 Rust and Swift 中,您可以创建一片 either/both 数组和字符串,它不会创建元素的新副本,但可以让您使用范围或迭代器查看现有元素并在内部实现了参考对或参考+长度。
Kotlin有类似的概念吗?好像有个similar concept for lists.
很难 Google 因为有一个名为“slice”的函数似乎可以复制元素。我是完全弄错了还是遗漏了?
(我知道我可以轻松解决这个问题。顺便说一句,我没有 Java 背景。)
我不这么认为。
您可以使用asList
to get a view of the Array as a list. Then the function you already found, subList
works as usual. However, I'm not aware of an equivalent of subList
for Array
s. The list returned from asList
is immutable, so you cannot use it to modify the array. If you attempt to make the list mutable via 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
索引。
在 Rust and Swift 中,您可以创建一片 either/both 数组和字符串,它不会创建元素的新副本,但可以让您使用范围或迭代器查看现有元素并在内部实现了参考对或参考+长度。
Kotlin有类似的概念吗?好像有个similar concept for lists.
很难 Google 因为有一个名为“slice”的函数似乎可以复制元素。我是完全弄错了还是遗漏了?
(我知道我可以轻松解决这个问题。顺便说一句,我没有 Java 背景。)
我不这么认为。
您可以使用asList
to get a view of the Array as a list. Then the function you already found, subList
works as usual. However, I'm not aware of an equivalent of subList
for Array
s. The list returned from asList
is immutable, so you cannot use it to modify the array. If you attempt to make the list mutable via 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
索引。