我尋找科特林替代:在LISP
(cons 1 '(2 3))
或
1 : [2, 3]
在Haskell或階
1 :: List(2, 3)
,
(其在像某物所有結果[1,2,3])
所以我可以在List<T>
(或其他您可以提供的列表)中添加一個元素。科特林前置元件
這也將是很好,如果一個能提供O(1)head
和tail
科特林替代品(我發現剛first()
)
我尋找科特林替代:在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