2017-03-19 75 views
4

我尋找科特林替代:在LISP
(cons 1 '(2 3))
1 : [2, 3]在Haskell或階
1 :: List(2, 3)
(其在像某物所有結果[1,2,3])
所以我可以在List<T>(或其他您可以提供的列表)中添加一個元素。科特林前置元件

這也將是很好,如果一個能提供O(1)headtail科特林替代品(我發現剛first()

+0

列表是否鏈接?如果結構不是由它制定的,則可能需要昂貴的操作。 – Carcigenicate

+0

@Carcigenicate它們應該是[Kotlin Standart Library](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html)。 – Columpio

+0

@Columpio「他們應該是[鏈表]」 - 你爲什麼這麼認爲? Kotlin的stdlib很少使用鏈接列表。你提供的鏈接沒有關於這個問題的信息。 – voddan

回答

2

它實現的任何類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] 
+0

是否有任何方法實際_return_新列表? 'push'會改變名單,我不想那 – Columpio

+0

@Columpio現在你必須使用第三方收集庫來獲得高效的不可變收藏 – IRus

+0

>第三方收集 ok,thx – Columpio

-3

我不完全知道你想要做什麼,所以請儘量一個以下的。

變異列表:

val list = mutableListOf(3, 2) 
list.add(1) 

柯平的不可變列表:

var list = listOf(3, 2) 
list = list + 1 
+0

** prepend **一個元素,而不是追加 – Columpio

+0

雅,這並沒有真正回答這個問題。 – Carcigenicate

+0

在Haskell中,最有效的操作是預先設定的,所以這就是人們所做的。在Kotlin中,追加在大多數情況下效率更高,這就是爲什麼它更常見。 – voddan

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 tail function

0

要儘可能接近爲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不可變集合(不僅僅是我們目前擁有的只讀)。截至目前,這個項目還處於非常早期的階段(我無法找到支持高效的前置/頭部/尾部的結構)