답변:
이것은 잘 작동합니다.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
또한 toMutableList()
구현을 호출하기 때문에 작동합니다 .
===
하고 말할 필요가 toList()
컬렉션을 복사하지 않습니다,하지만 toMutableList()
않습니다
Iterable.toList()
반환 emptyList()
항상 같은 (불변) 객체를 반환한다. 따라서 테스트 emptyList()
하면 동일한 개체를 다시 얻을 수 있습니다.
toMutableList()
. 메서드를 호출하는 인스턴스가 이미 변경 가능한 목록 인 경우 목록의 새 인스턴스를 반환해야하는 문서 부여 내용은 없습니다 .
당신이 사용할 수있는
목록-> 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
두 가지 대안을 생각해 낼 수 있습니다.
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
A는 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)
때문에 이어야하지 않습니까? 아니면 ? this
apply
mutableListOf<T>().also { it.addAll(this) }
얕은 카피의 경우
.map{it}
이는 많은 컬렉션 유형에서 작동합니다.
Map
s 에서는 작동하지 않습니다 . 컴파일되지만 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