web-dev-qa-db-ja.com

Kotlinさんのリストに "add"、 "remove"などがありませんか?

Javaでは、次のことができます。

public class TempClass {
    List<Integer> myList = null;
    void doSomething() {
        myList = new ArrayList<>();
        myList.add(10);
        myList.remove(10);
    }
}

しかし、以下のように直接Kotlinに書き換えると

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}

私のリストからaddremove関数が見つからないというエラーが出ました

私はそれをArrayListにキャストすることを回避しますが、それをキャストする必要があるのは奇妙なことですが、Javaではキャストは必要ありません。そして、それは抽象クラスListを持つ目的を無効にします

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        (myList!! as ArrayList).add(10)
        (myList!! as ArrayList).remove(10)
    }
}

Javaでできることのように、私がListを使うがそれをキャストする必要がない方法はありますか?

134
Elye

多くの言語とは異なり、Kotlinは可変コレクションと不変コレクション(リスト、セット、マップなど)を区別します。コレクションをいつ編集できるかを正確に制御することは、バグを排除し、優れたAPIを設計するのに役立ちます。

https://kotlinlang.org/docs/reference/collections.html

MutableListリストを使う必要があるでしょう。

class TempClass {
    var myList: MutableList<Int> = mutableListOf<Int>()
    fun doSomething() {
        // myList = ArrayList<Int>() // initializer is redundant
        myList.add(10)
        myList.remove(10)
    }
}

MutableList<Int> = arrayListOf()も動作するはずです。

250
fuzz

さまざまな方法でKotlinでListコレクションを定義する

  • 不変(読み取り専用)リストを持つ不変変数:

    val users: List<User> = listOf( User("Tom", 32), User("John", 64) )
    


  • 可変リストを持つ不変変数:

    val users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
    

    または初期値なし - 空のリストおよび明示的な変数型なし

    val users = mutableListOf<User>()
    //or
    val users = ArrayList<User>()
    
    • あなたはリストにアイテムを追加することができます:
      • users.add(anohterUser)または
      • users += anotherUser(フードの下ではusers.add(anohterUser)です)


  • 不変リストを持つ可変変数:

    var users: List<User> = listOf( User("Tom", 32), User("John", 64) )
    

    または初期値なし - 空のリストおよび明示的な変数型なし

    var users = emptyList<User>()
    
    • 注:リストに*項目を追加することができます:
      • users += anotherUser - *新しいArrayListを作成し、それをusersに割り当てます


  • 可変リストを持つ可変変数:

    var users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
    

    または初期値なし - 空のリストおよび明示的な変数型なし

    var users = emptyList<User>().toMutableList()
    //or
    var users = ArrayList<User>()
    
    • 注:リストに項目を追加することができます:
      • users.add(anohterUser)
      • users += anotherUser を使用しない

        エラー:Kotlin:代入演算子のあいまいさ:
        パブリック演算子fun Collection.plus(element:String):kotlin.collectionsに定義されているリスト
        @ InlineOnlyパブリックインライン演算子fun mutableCollection.plusAssign(element:String):kotlin.collectionsに定義されている単位


こちらもご覧ください。 https://kotlinlang.org/docs/reference/collections.html

24
Lukas

MutableListを使用する上記のすべての回答に同意しますが、リストから追加/削除して、以下のように新しいリストを取得することもできます。

val newListWithElement = existingList + listOf(element)
val newListMinusElement = existingList - listOf(element)

または

val newListWithElement = existingList.plus(element)
val newListMinusElement = existingList.minus(element)
6
dinesh salve

どうやら、デフォルトのKotlinのリストは不変です。変更可能なリストを作成するには、以下のようにMutableListを使用する必要があります。

class TempClass {
    var myList: MutableList<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}

更新それでも、本当に変更したいリストがない限り、MutableListを使用することはお勧めできません。どのように読むために https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 を参照します唯一のコレクションは、より良いコーディングを提供します。

5
Elye

https://kotlinlang.org/docs/reference/collections.html

上記のリンクによると、リスト<E>はKotlinでは不変です。しかしこれはうまくいくでしょう:

var list2 = ArrayList<String>()
list2.removeAt(1)
3
sgrover

Kotlinでは、MutableListまたはArrayListを使用する必要があります。

MutableListのメソッドがどのように機能するのかを見てみましょう。

var listNumbers: MutableList<Int> = mutableListOf(10, 15, 20)
// Result: 10, 15, 20

listNumbers.add(1000)
// Result: 10, 15, 20, 1000

listNumbers.add(1, 250)
// Result: 10, 250, 15, 20, 1000

listNumbers.removeAt(0)
// Result: 250, 15, 20, 1000

listNumbers.remove(20)
// Result: 250, 15, 1000

for (i in listNumbers) { 
    println(i) 
}

ArrayListのメソッドがどのように機能するのかを見てみましょう。

var arrayNumbers: ArrayList<Int> = arrayListOf(1, 2, 3, 4, 5)
// Result: 1, 2, 3, 4, 5

arrayNumbers.add(20)
// Result: 1, 2, 3, 4, 5, 20

arrayNumbers.remove(1)
// Result: 2, 3, 4, 5, 20

arrayNumbers.clear()
// Result: Empty

for (j in arrayNumbers) { 
    println(j) 
}

お役に立てれば。

3
ARGeo

listimmutableによるDefaultです。代わりにArrayListを使用することができます。このような :

 val orders = arrayListOf<String>()

それからあなたは以下のようにこれからアイテムをadd/deleteできます:

orders.add("Item 1")
orders.add("Item 2")

デフォルトでArrayListmutableなので、操作を実行できます。

1
Thunder

不変データの概念では、おそらくこれがより良い方法です。

class TempClass {
    val list: List<Int> by lazy {
        listOf<Int>()
    }
    fun doSomething() {
        list += 10
        list -= 10
    }
}
1
bbsimon

ここでの一番上の答えは、読み取り専用のList(注: 読み取り専用であり、「不変」 ではない)とMutableListの違いを正しく表しています。 。

一般に、読み取り専用リストの使用に努める必要がありますが、構築時、特に機能的でないインタフェースを持つサードパーティ製ライブラリを扱う場合には、可変性は依然として有用です。直接listOfを使用する、またはfoldreduceのような関数構造を適用するなど、別の構築方法が利用できない場合は、一時的に変更可能なものから読み取り専用のリストを作成します。

val readonlyList = mutableListOf<...>().apply {
  // manipulate your list here using whatever logic you need
  // the `apply` function sets `this` to the `MutableList`
  add(foo1)
  addAll(foos)
  // etc.
}.toList()

これは再利用可能なインラインユーティリティ関数にうまくカプセル化できます。

inline fun <T> buildList(block: MutableList<T>.() -> Unit) = 
  mutableListOf<T>().apply(block).toList()

これは次のように呼び出すことができます。

val readonlyList = buildList<String> {
  add("foo")
  add("bar")
}

これで、すべての可変性は読み取り専用リストの作成に使用される1つのブロックスコープに分離され、残りのコードはビルダーから出力される読み取り専用リストを使用します。

0
Raman

このような新しいものを作成することができます。

var list1 = ArrayList<Int>()
var list2  = list1.toMutableList()
list2.add(item)

これでlist2を使用できます。ありがとうございます。

0
Dalvinder Singh