2017-03-19 80 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不可变集合(不仅仅是我们目前拥有的只读)。截至目前,这个项目还处于非常早期的阶段(我无法找到支持高效的前置/头部/尾部的结构)