Kotlin prepend元素

我正在寻找Kotlin替代:
(cons 1 '(2 3))在lisp或
1 : [2, 3]在haskell或
1 :: List(2, 3)在斯卡拉,
(所有的结果都像[1,2,3])
所以我可以在List<T> (或者其他你可以提供的列表)中添加一个元素。

如果可以提供O(1) headtail 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