[list] Kotlin에서 목록을 복제하거나 복사하는 방법

Kotlin에서 목록을 복사하는 방법은 무엇입니까?

나는 사용하고있다

val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)

더 쉬운 방법이 있습니까?



답변

이것은 잘 작동합니다.

val selectedSeries = series.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()새 목록을 제공 하는 제공된 확장 을 사용할 수 있습니다 . 의 서명과 불행하게도, 문서 제안,는이 수 있도록 의미있어 IterableA는 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.

또한 이것은 당신에게 얕은 사본 만 제공한다는 점에 유의하십시오 .


답변

얕은 카피의 경우

.map{it}

이는 많은 컬렉션 유형에서 작동합니다.


답변

Java에서와 같이 :

명부:

    val list = mutableListOf("a", "b", "c")
    val list2 = ArrayList(list)

지도:

    val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
    val map2 = HashMap(map)

JVM (또는 Android)을 대상으로한다고 가정합니다. ArrayList 및 HashMap의 복사 생성자에 의존하기 때문에 다른 대상에서 작동하는지 확실하지 않습니다.