科特林前置元件
我寻找科特林替代:在LISP (cons 1 '(2 3))
或1 : [2, 3]
在Haskell或阶1 :: List(2, 3)
,
(其在像某物所有结果[1,2,3])
所以我可以在List<T>
(或其他您可以提供的列表)中添加一个元素。科特林前置元件
这也将是很好,如果一个能提供O(1)head
和tail
科特林替代品(我发现刚first()
)
它实现的任何类Deque
会适合你,比如LinkedList
:
val linkedList = LinkedList(listOf(2, 3))
linkedList.push(1)
println(linkedList) // [1, 2, 3]
创建列表throught构造函数LinkedList(listOf(2, 3))
in man y位可以是恼人,所以随便写工厂方法:
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]
我不完全知道你想要做什么,所以请尽量一个以下的。
变异列表:
val list = mutableListOf(3, 2)
list.add(1)
柯平的不可变列表:
var list = listOf(3, 2)
list = list + 1
** prepend **一个元素,而不是追加 – Columpio
雅,这并没有真正回答这个问题。 – Carcigenicate
在Haskell中,最有效的操作是预先设定的,所以这就是人们所做的。在Kotlin中,追加在大多数情况下效率更高,这就是为什么它更常见。 – voddan
我认为最简单的是写:
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 tail function
要尽可能接近为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不可变集合(不仅仅是我们目前拥有的只读)。截至目前,这个项目还处于非常早期的阶段(我无法找到支持高效的前置/头部/尾部的结构)
列表是否链接?如果结构不是由它制定的,则可能需要昂贵的操作。 – Carcigenicate
@Carcigenicate它们应该是[Kotlin Standart Library](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)。 – Columpio
@Columpio“他们应该是[链表]” - 你为什么这么认为? Kotlin的stdlib很少使用链接列表。你提供的链接没有关于这个问题的信息。 – voddan