Kotlin前置元素

Col*_*pio 11 list insert cons prepend kotlin

我正在寻找Kotlin替代:
(cons 1 '(2 3))在lisp或
1 : [2, 3]haskell或
1 :: List(2, 3)scala中
(这些都会产生类似于[1,2,3])
所以我可以将一个元素添加到List<T>(或者您可以提供的任何其他列表)中.

如果能提供O(1)headtailKotlin替代品(我发现的话first())也没关系

Rus*_*lan 9

任何实现的类Deque都适合您,例如LinkedList:

val linkedList = LinkedList(listOf(2, 3))
linkedList.push(1)
println(linkedList) // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)


Str*_*lok 9

我认为最简单的是写:

var list = listOf(2,3)
println(list) // [2, 3]
list = listOf(1) + list
println(list) // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

没有具体的tail实现,但你可以调用.drop(1)来获得相同的.您可以head\tail通过编写以下扩展属性来使其更通用:

val <T> List<T>.tail: List<T>
  get() = drop(1)

val <T> List<T>.head: T
  get() = first()
Run Code Online (Sandbox Code Playgroud)

然后:

val list = listOf(1, 2, 3)
val head = list.head
val tail = list.tail
Run Code Online (Sandbox Code Playgroud)

更多信息:Kotlin List尾部功能


Luz*_*ian 7

简单,只需将元素包裹在 a 中List,然后使用+运算符(或List.plus())将两者连接起来Lists

val list1 = listOf(2, 3)        // [2, 3]
val list2 = listOf(1) + list1   // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

对于你的第二个问题,在 Kotlin 1.2 中有:

List.first()
List.last()
Run Code Online (Sandbox Code Playgroud)

两者都是 O(1)


Fat*_*tih 5

这可以通过扩展功能轻松完成,如下所示

前置元素

fun <T> MutableList<T>.prepend(element: T) {
    add(0, element)
}
Run Code Online (Sandbox Code Playgroud)

前置列表

fun <T> MutableList<T>.prependAll(elements: List<T>) {
    addAll(0, elements)
}
Run Code Online (Sandbox Code Playgroud)