Kotlin前置元素

问题描述 投票:7回答:6

我在寻找Kotlin的替代方案: (cons 1 '(2 3))在lisp或 1 : [2, 3] in haskell或 斯卡拉的1 :: List(2, 3), (所有结果都像[1,2,3]) 所以我可以将一个元素添加到List<T>(或您可以提供的任何其他列表)。

如果可以提供O(1)headtail Kotlin替代品(我发现只是first())也没关系

list insert kotlin prepend cons
6个回答
5
投票

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

val linkedList = LinkedList(listOf(2, 3))
linkedList.push(1)
println(linkedList) // [1, 2, 3]

通过构造函数qazxsw poi在很多地方创建列表可能很烦人,所以随意编写工厂方法:

LinkedList(listOf(2, 3))

8
投票

我认为最简单的是写:

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]

没有特定的var list = listOf(2,3) println(list) // [2, 3] list = listOf(1) + list println(list) // [1, 2, 3] 实现,但你可以调用.drop(1)来获得相同的结果。你可以通过编写这些扩展属性使这个tail更通用:

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


2
投票

简单,只需将元素包装在Kotlin List tail function前面,然后使用List运算符(或+)连接两个List.plus()

Lists

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

val list1 = listOf(2, 3)        // [2, 3]
val list2 = listOf(1) + list1   // [1, 2, 3]

两者都是O(1)


0
投票

尽可能接近Lisp考虑使用不可变链表。

你可以使用List.first() List.last()

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] 准备就绪时,我们将获得更好的API。这是努力创建标准的Kotlin不可变集合(不仅仅是我们目前拥有的只读集合)。到目前为止,这个项目还处于初期阶段(我无法找到支持高效前置/头/尾的结构)


0
投票

如果您出于某种原因经常在代码中执行此操作,请考虑添加扩展运算符方法,例如:

kotlinx.collections.immutable

然后你的代码可以像Scala一样工作:operator fun <T> T.plus(tail: List<T>): List<T> { val list = ArrayList<T>(1 + tail.size) list.add(this) list.addAll(tail) return list }

另一种实现相同行为的方法,更短但牺牲了一些记忆:

1 + listOf(2, 3)

-3
投票

我不完全确定你想做什么,所以请尝试下列之一。

变异名单:

operator fun <T> T.plus(tail: List<T>): List<T> {
    return mutableListOf(this).apply {
        addAll(tail)
    }
}

复制不可变列表:

val list = mutableListOf(3, 2)
list.add(1)
© www.soinside.com 2019 - 2024. All rights reserved.