programing

kotlin에서 목록을 복제하거나 복사하는 방법

closeapi 2023. 4. 16. 15:08
반응형

kotlin에서 목록을 복제하거나 복사하는 방법

코틀린에서 목록을 복사하는 방법은?

사용하고 있다

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

더 쉬운 방법은 없나요?

이거 잘 돼.

val selectedSeries = series.toMutableList()

사용할 수 있습니다.

목록 -> toList()

어레이 -> to Array()

Array List -> to Array()

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

목록에 kotlin 데이터 클래스가 있는 경우 이 작업을 수행할 수 있습니다.

selectedSeries = ArrayList(series.map { it.copy() })

다음 두 가지 방법을 생각해 낼 수 있습니다.

1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }

2. val selectedSeries = mutableListOf(*series.toTypedArray())

업데이트: 새로운 타입 추론 엔진(Kotlin 1.3에서는 opt-in)을 사용하면 첫 번째 예에서는 범용 타입 파라미터를 생략하고 다음과 같이 설정할 수 있습니다.

1. val selectedSeries = mutableListOf().apply { addAll(series) }

참고: 새로운 추론을 선택하는 방법은kotlinc -Xnew-inference ./SourceCode.kt명령줄 또는kotlin { experimental { newInference 'enable'}그래들을 위해.새로운 유형 추론에 대한 자세한 내용은 KotlinConf 2018 - Svetlana Isakova의 새로운 유형 추론과 관련 언어 특징, 특히 '빌더에 대한 추론'을 확인하십시오.

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의 복사 컨스트럭터에 의존하기 때문에 다른 타겟에서는 동작하지 않습니다.

제공된 내선번호를 사용할 수 있습니다.Iterable.toMutableList()새로운 목록을 제공할 것입니다.불행하게도, 그 서명과 문서가 시사하는 바와 같이, 이 문서는 다음 사항을 확실하게 하기 위한 것입니다.Iterable는 입니다.List(마치toString기타 다수to<type>메서드).그것이 새로운 목록이 될 이라고 장담할 수 있는 것은 아무것도 없다.예를 들어, 확장의 선두에 다음 행을 추가합니다.if (this is List) return this는 정당한 퍼포먼스 향상입니다(실제로 퍼포먼스가 향상되는 경우).

또, 그 이름 때문에, 결과 코드가 명확하지 않습니다.

결과를 확실히 하기 위해서, 독자적인 확장을 추가하고, 보다 명확한 코드를 작성합니다(어레이의 경우와 같음).

fun <T> List<T>.copyOf(): List<T> {
    return mutableListOf<T>().also { it.addAll(this) }
}

fun <T> List<T>.mutableCopyOf(): MutableList<T> {
    return mutableListOf<T>().also { it.addAll(this) }
}

주의:addAll네이티브를 사용하여 복사하는 것이 가장 빠릅니다.System.arraycopy실시에 있어서ArrayList.

또, 이것은 당신에게 얄팍한 카피밖에 주지 않게 주의해 주세요.

편집:

보다 일반적인 버전을 사용할 수 있습니다.

fun <T> Collection<T>.copyOf(): Collection<T> {
    return mutableListOf<T>().also { it.addAll(this) }
}

fun <T> Collection<T>.mutableCopyOf(): MutableCollection<T> {
    return mutableListOf<T>().also { it.addAll(this) }
}

얄팍한 복사를 위해, 나는 제안합니다.

.map{it}

그것은 많은 컬렉션 타입에 대응합니다.

를 사용할 수 있습니다.ArrayList컨스트럭터:ArrayList(list)

확장 방법을 사용합니다.

val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())

새로 만듭니다.MutableList그런 다음 원본의 각 요소를 새로 만든 목록에 추가합니다.

여기서 유추된 유형은 다음과 같습니다.MutableList<String>이 새 목록의 변경 가능성을 표시하지 않으려면 유형을 불변 목록으로 명시적으로 선언할 수 있습니다.

val copy: List<String> = original.toCollection(mutableListOf())
val selectedSeries = listOf(*series.toTypedArray())
var oldList: List<ClassA>?
val newList = oldList.map { it.copy() }

얕은 카피, 딥 카피 클로닝, 그 외의 많은 시도 끝에, 이 솔루션은 확실히 당신에게 효과가 있을 것입니다.

val iterator: Iterator<Object> = yourList.iterator()
        while (iterator.hasNext())
        newList.add(iterator.next().copy())

IMHO는 Kotlin의 새로운 버전(1.6+)에서 컬렉션 빌더를 사용하는 것이 가장 좋고 가장 독특한 방법입니다.

   val shallowListCopy = buildList { addAll(list) }

심플 리스트에는, 상기의 적절한 솔루션이 많이 있습니다.

하지만, 얕은 여울 목록을 위한 것일 뿐이죠.

2차원에 합니다.ArrayListArrayList 보면,은 ' 좋다'에 해당합니다.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

Kotlin에서 목록을 복사하기 위해 아래 코드를 사용해 보십시오.

arrayList2.addAll(arrayList1.filterNotNull())

언급URL : https://stackoverflow.com/questions/46846025/how-to-clone-or-copy-a-list-in-kotlin

반응형