web-dev-qa-db-ja.com

Kotlinプリペンド要素

私はKotlinの代替案を探しています:
_(cons 1 '(2 3))_ LISPまたは
_1 : [2, 3]_ haskellまたは
1 :: List(2, 3) in scala、
(結果はすべて[1、2、3]のようなsthになります)
したがって、要素を_List<T>_(または提供できる他のリスト)の前に追加できます。

O(1) headおよびtail Kotlinの代替案を提供できる場合も問題ありません(私はfirst()だけを見つけました) )

13
Columpio

Dequeを実装する任意のクラス、たとえばLinkedListが適しています。

_val linkedList = LinkedList(listOf(2, 3))
linkedList.Push(1)
println(linkedList) // [1, 2, 3]
_

多くの場所でコンストラクタ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]
_
5
IRus

私は書くのが最も簡単だと思います:

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リストテール関数

7
Strelok

単純で、要素をListでラップして、_+_演算子(またはList.plus())を使用して2つのListsを連結します。

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

2番目の質問については、Kotlin 1.2には次のものがあります。

_List.first()
List.last()
_

どちらもO(1)です

2
Luzian

何らかの理由でコードで頻繁にそれを行う場合は、次のような拡張演算子メソッドを追加することを検討してください。

_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
}
_

次に、コードはScalaのように機能します。1 + listOf(2, 3)

同じ動作を実現するもう1つの方法は、短くなりますが、メモリをいくらか犠牲にします。

_operator fun <T> T.plus(tail: List<T>): List<T> {
    return mutableListOf(this).apply {
        addAll(tail)
    }
}
_
0
Alexey Soshin

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

(残念ながら、これには1つの割り当てが必要です)

尾:

list - 0 // [2, 3]
list.subList(1) // [2, 3]  

見苦しい。

うまくいけば、 kotlinx.collections.immutable の準備ができたら、より良いAPIが得られるでしょう。これは、標準のKotlin不変コレクション(現在の読み取り専用のコレクションだけではありません)を作成するためのものです。現在のところ、このプロジェクトはまだ非常に初期の段階です(効率的なプリペンド/ヘッド/テールをサポートする構造を見つけることができませんでした)。

0
xap4o