Kotlin 如何创建具有原始列表的每一秒元素的代理列表?
我需要一个包装器列表,它反映原始列表的所有更改,如Kotlin 如何创建具有原始列表的每一秒元素的代理列表?,kotlin,Kotlin,我需要一个包装器列表,它反映原始列表的所有更改,如subList(),但只包含第二个元素 我试过: fun getWrapperList(原始列表:列表):列表= IntRange(0,original_list.size.div(2)).map{original_list[it*2+1]} 但它会创建一个不反映更改的新列表。您应该能够执行以下操作(使用computed属性) 您应该能够执行以下操作(使用computedproperty) 我认为标准库中没有这方面的内容,因为这不是一个常见的需
subList()
,但只包含第二个元素
我试过:
fun getWrapperList(原始列表:列表):列表=
IntRange(0,original_list.size.div(2)).map{original_list[it*2+1]}
但它会创建一个不反映更改的新列表。您应该能够执行以下操作(使用
computed
属性)
您应该能够执行以下操作(使用
computed
property)
我认为标准库中没有这方面的内容,因为这不是一个常见的需求。(我记得只有在我想访问备用元素的时候,我才应该将代码重构为子对象列表…) 但是你可以很容易地创建自己的 最简单的方法可能是通过扩展,例如:
如果性能很重要,您可能应该考虑覆盖更多的
AbstractList
方法,甚至直接实现。但这可能需要大量的工作,在许多情况下,这个简单的版本应该足够了。我认为标准库中没有任何内容可以满足这一要求,因为这不是常见的要求(我记得只有在我想访问备用元素的时候,我才应该将代码重构为子对象列表…)
但是你可以很容易地创建自己的
最简单的方法可能是通过扩展,例如:
如果性能很重要,您可能应该考虑覆盖更多的
AbstractList
方法,甚至直接实现。但这可能需要大量的工作,而且这个简单的版本在很多情况下应该足够了。我不认为这不是代理列表,因为如果您调用someClass.derivedList
并保留对结果的引用,该引用不会反映问题中提到的任何后续更改。我不认为这不是代理列表,因为如果调用someClass.derivedList
并保留对结果的引用,该引用不会反映问题中提到的任何后续更改。
class SomeClass {
val originalList = mutableListOf(1, 2, 3, 4, 5, 6)
val derivedList: List<Int>
get() = originalList.filterIndexed { index, i -> index % 2 == 0 }
}
fun main() {
val someClass = SomeClass()
println(someClass.originalList)
println(someClass.derivedList)
someClass.originalList.add(7)
println(someClass.derivedList)
}
[1, 2, 3, 4, 5, 6]
[1, 3, 5]
[1, 3, 5, 7]
class AlternateView<T>(val sourceList: List<T>): AbstractList<T>() {
override val size get() = (sourceList.size + 1) / 2
override fun get(index: Int) = sourceList[index * 2]
}
val list = mutableListOf(1, 2, 3, 4, 5, 6)
val view = AlternateView(list)
println("list=$list, view=$view") // list=[1, 2, 3, 4, 5, 6], view=[1, 3, 5]
list[0] = 7
list.removeAt(1)
list.add(4, 8)
println("list=$list, view=$view") // list=[7, 3, 4, 5, 8, 6], view=[7, 4, 8]