Kotlin prepend元素
我正在寻找Kotlin替代:
(cons 1 '(2 3))
在lisp或
1 : [2, 3]
在haskell或
1 :: List(2, 3)
在斯卡拉,
(所有的结果都像[1,2,3])
所以我可以在List<T>
(或者其他你可以提供的列表)中添加一个元素。
如果可以提供O(1) head
和tail
Kotlin替代品(我刚刚发现first()
),也是没有问题的。
任何实现Deque
类都适合你,例如LinkedList
:
val linkedList = LinkedList(listOf(2, 3)) linkedList.push(1) println(linkedList) // [1, 2, 3]
在许多地方通过构造函数LinkedList(listOf(2, 3))
创建列表可能很烦人,所以随意写出工厂方法:
fun <T> linkedListOf(vararg elements: T): LinkedList<T> { return LinkedList<T>(elements.toList()) } // Usage: val list = linkedListOf(2, 3) list.push(1) println(list) // [1, 2, 3]
我认为最简单的就是写:
var list = listOf(2,3) println(list) // [2, 3] list = listOf(1) + list println(list) // [1, 2, 3]
没有特定的tail
实现,但可以调用.drop(1)来获得相同的结果。 通过编写这些扩展属性,可以使这个head\tail
更通用:
val <T> List<T>.tail: List<T> get() = drop(1) val <T> List<T>.head: T get() = first()
然后:
val list = listOf(1, 2, 3) val head = list.head val tail = list.tail
更多信息: Kotlin List尾巴功能
尽可能接近Lisp考虑使用不可变链接列表。
你可以使用pcollections
val list = ConsPStack.from(listOf(2, 3)) val newList = list + 1 println(list) // [2, 3] println(newList) // [1, 2, 3]
头:
list.first() // 1 list[0] // 1
(不幸的是这件事需要一个分配)
尾巴:
list - 0 // [2, 3] list.subList(1) // [2, 3]
看起来相当丑陋。
希望当kotlinx.collections.immutable准备就绪时,我们会得到更好的API。 这是一个努力创建标准Kotlin不可变集合(不只是我们目前拥有的只读)。 到目前为止,这个项目还处于非常早期的阶段(我无法找到支持高效率的前端/头部/尾部的结构)
我不完全确定你想要做什么,所以请尝试下列其中一项。
突变列表:
val list = mutableListOf(3, 2) list.add(1)
复制一个不可变列表:
var list = listOf(3, 2) list = list + 1