如答案https://stackoverflow.com/a/57115894/3286489中所述,asReversed()
将生成一个反向列表,如果原始列表中的元素已更改,则该值将更改。
val list = mutableListOf(0, 1, 2, 3, 4, 5)
val asReversed = list.asReversed()
val reversed = list.reversed()
println("Original list: $list")
println("asReversed: $asReversed")
println("reversed: $reversed")
list[0] = 10
println("Original list: $list")
println("asReversed: $asReversed")
println("reversed: $reversed")
产出
Original list: [0, 1, 2, 3, 4, 5]
asReversed: [5, 4, 3, 2, 1, 0]
reversed: [5, 4, 3, 2, 1, 0]
Original list: [10, 1, 2, 3, 4, 5]
asReversed: [5, 4, 3, 2, 1, 10]
reversed: [5, 4, 3, 2, 1, 0]
对我来说,这意味着仅当原始列表是
MutableList
时,它才能在其中更改其值。但是,如果原始List是一个不变的
List
,则它的值无法更改,这本质上使asReversed()
和reversed()
没有明显区别,对吧?即
val list = listOf(0, 1, 2, 3, 4, 5)
val asReversed = list.asReversed() // This is the same as below?
val reversed = list.reversed() // This is the same as above?
我有没有想过它们仍然不同的情况?
更新了
我什至更改了它包含的
mutableList
val list = listOf(
mutableListOf(1),
mutableListOf(2),
mutableListOf(3),
mutableListOf(4),
mutableListOf(5),
mutableListOf(6))
val asReversed = list.asReversed()
val reversed = list.reversed()
println("Original list: $list")
println("asReversed: $asReversed")
println("reversed: $reversed")
list[0][0] = 10
println("Original list: $list")
println("asReversed: $asReversed")
println("reversed: $reversed")
输出量
Original list: [[1], [2], [3], [4], [5], [6]]
asReversed: [[6], [5], [4], [3], [2], [1]]
reversed: [[6], [5], [4], [3], [2], [1]]
Original list: [[5], [2], [3], [4], [5], [6]]
asReversed: [[6], [5], [4], [3], [2], [10]]
reversed: [[6], [5], [4], [3], [2], [10]]
这对于
asReversed
和reversed
结果都会改变 最佳答案
两者之间最重要的区别是,asReversed
始终只是原始列表上的 View 。这意味着,如果更改原始列表,则asReversed
的结果将始终包含所有更新的信息。最后,这只是一个 View 。reversed
始终为您提供原始列表的新断开连接列表。但是请注意,当您处理原始列表中的对象引用(例如列表中的列表或其他类型的可引用对象)时,您将看到该列表中原始对象的所有改编也以相反的形式改编,无论是使用reversed
还是asReversed
。
关于更新,很遗憾,您使用了这样的包含参考的列表。但是,与原始列表相比,区别更加明显:
val asReversed = list.asReversed()
val reversed = list.reversed()
fun printAll(msg : String) {
println(msg)
println("Original list: $list")
println("asReversed: $asReversed")
println("reversed: $reversed")
}
printAll("Initial ----")
list as MutableList
list[2] = 1000
printAll("mutating original list ----")
reversed as MutableList
reversed[4] = 3000
printAll("mutating reversed list ----")
由于
asReversed
返回的是ReversedListReadOnly
类型,因此您无法轻松将其转换为MutableList
,但是如果可能的话,asReversed
中的更改将反射(reflect)在原始列表中,而不是reversed
中。上面的输出如下:Initial ----
Original list: [0, 1, 2, 3, 4, 5]
asReversed: [5, 4, 3, 2, 1, 0]
reversed: [5, 4, 3, 2, 1, 0]
mutating original list ----
Original list: [0, 1, 1000, 3, 4, 5]
asReversed: [5, 4, 3, 1000, 1, 0]
reversed: [5, 4, 3, 2, 1, 0]
mutating reversed list ----
Original list: [0, 1, 1000, 3, 4, 5]
asReversed: [5, 4, 3, 1000, 1, 0]
reversed: [5, 4, 3, 2, 3000, 0]
如您所见:更改很好地反射(reflect)在原始列表和
asReversed
-list中,但是reversed
的更改未反射(reflect)出来,并且相反的更改将不包含原始列表改编。所以,是的,您可能会错过这种情况...列表(
reversed
和asReversed
)不相等,即使您输入的是只读 View 也不相等,因为没有人可以保证您列表不会被更改。 。既不是原始的也不是asReversed
之一。