回答:
これは正常に動作します。
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()またtoMutableList()、その実装を呼び出すため、機能します。
===と言っているtoList()コレクションをコピーするのではなく、toMutableList()ない
Iterable.toList()はemptyList()、常に同じ(不変)オブジェクトを返すを返します。したがって、テストするとemptyList()、同じオブジェクトが返されます。
toMutableList()メソッドを呼び出すインスタンスがすでに変更可能なリストである場合、リストの新しいインスタンスを返すはずのdocs Grantには何もありません。
使用できます
リスト-> toList()
配列-> toArray()
ArrayList-> toArray()
MutableList-> toMutableList()
例:
val array = arrayListOf("1", "2", "3", "4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
ログを印刷:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
私は2つの代替方法を考え出すことができます:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
更新:新しい型推論エンジン(Kotlin 1.3のオプトイン)を使用すると、最初の例でジェネリック型パラメーターを省略でき、次のようになります。
1. val selectedSeries = mutableListOf().apply { addAll(series) }
参考:新しい推論をオプトインする方法はkotlinc -Xnew-inference ./SourceCode.kt、コマンドラインまたはkotlin { experimental { newInference 'enable'}Gradleです。新しい型推論の詳細については、このビデオを確認してください:KotlinConf 2018-Svetlana Isakovaによる新しい型推論と関連言語機能、特に「30歳のビルダーの推論」
リストがkotlinデータクラスを保持している場合、これを行うことができます
selectedSeries = ArrayList(series.map { it.copy() })
Iterable.toMutableList()新しいリストを提供する提供された拡張機能を使用できます。残念ながら、そのシグネチャとドキュメントが示唆しているように、それはであることを保証することを意図していIterableますList(ちょうどtoString他の多くのto<type>メソッドと同じです)。それが新しいリストになることを保証するものは何もありません。たとえば、拡張機能の先頭に次の行を追加するif (this is List) return thisと、正当なパフォーマンスの向上になります(実際にパフォーマンスが向上する場合)。
また、その名前のため、結果のコードはあまり明確ではありません。
結果を確認し、より明確なコードを作成するために、独自の拡張機能を追加することを好みます(配列の場合と同様に)。
fun <T> List<T>.copyOf(): List<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
fun <T> List<T>.mutableCopyOf(): MutableList<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
注addAllそれはネイティブを使用しているため、コピーに最速の方法でSystem.arraycopyの実装にArrayList。
また、これは浅いコピーのみを提供することに注意してください。
addAll(this@copyOf)ので、そうではありませんか?それか、それとも?thisapplymutableListOf<T>().also { it.addAll(this) }
浅いコピーの場合は、
.map{it}
これは、多くのコレクションタイプで機能します。
Maps では機能しないことに注意してください。これはコンパイルが、以来itでMap.Entry、コピーは浅いですが、あなたは同じエントリを持っています。
私が使用する拡張メソッドを:toCollection()
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
これにより新しいものが作成され、MutableList元の各要素が新しく作成されたリストに追加されます。
ここで推定される型はになりますMutableList<String>。この新しいリストの可変性を公開したくない場合は、タイプを不変リストとして明示的に宣言できます。
val copy: List<String> = original.toCollection(mutableListOf())
単純なリストの場合、上記の多くの正しい解決策があります。
ただし、浅いリストの場合のみです。
以下の関数は、任意の2次元で機能しますArrayList。ArrayList実際には、と同等MutableListです。興味深いことに、明示的なMutableList型を使用すると機能しません。より多くの次元が必要な場合は、より多くの関数を作成する必要があります。
fun <T>cloneMatrix(v:ArrayList<ArrayList<T>>):ArrayList<ArrayList<T>>{
var MatrResult = ArrayList<ArrayList<T>>()
for (i in v.indices) MatrResult.add(v[i].clone() as ArrayList<T>)
return MatrResult
}
整数行列のデモ:
var mat = arrayListOf(arrayListOf<Int>(1,2),arrayListOf<Int>(3,12))
var mat2 = ArrayList<ArrayList<Int>>()
mat2 = cloneMatrix<Int>(mat)
mat2[1][1]=5
println(mat[1][1])
それが示している 12