Câu trả lời:
Điều này hoạt động tốt.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
cũng hoạt động vì nó gọi toMutableList()
trong quá trình thực hiện của nó.
===
và phải nói toList()
không sao chép các bộ sưu tập, nhưng toMutableList()
không
Iterable.toList()
trả về emptyList()
, luôn trả về cùng một đối tượng (không thay đổi). Vì vậy, nếu bạn kiểm tra với emptyList()
bạn, bạn sẽ nhận lại được cùng một đối tượng.
toMutableList()
sẽ trả về một phiên bản mới của danh sách nếu phiên bản gọi phương thức đã là một danh sách có thể thay đổi.
Bạn có thể dùng
Danh sách -> toList ()
Mảng -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Thí dụ:
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())
in nhật ký:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Tôi có thể nghĩ ra hai cách thay thế:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Cập nhật: với công cụ Suy luận kiểu mới (chọn tham gia trong Kotlin 1.3), Chúng tôi có thể bỏ qua tham số kiểu chung trong ví dụ đầu tiên và có điều này:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
FYI: Cách chọn tham gia Suy luận mới là kotlinc -Xnew-inference ./SourceCode.kt
cho dòng lệnh hoặc kotlin { experimental { newInference 'enable'}
cho Gradle. Để biết thêm thông tin về Suy luận kiểu mới, hãy xem video này: KotlinConf 2018 - Suy luận kiểu mới và các tính năng ngôn ngữ liên quan của Svetlana Isakova , đặc biệt là 'suy luận cho người xây dựng' ở tuổi 30 '
Nếu danh sách của bạn đang chứa lớp dữ liệu kotlin , bạn có thể làm điều này
selectedSeries = ArrayList(series.map { it.copy() })
Bạn có thể sử dụng tiện ích mở rộng Iterable.toMutableList()
được cung cấp sẽ cung cấp cho bạn một danh sách mới. Thật không may, như chữ ký và tài liệu của nó gợi ý, nó có nghĩa là để đảm bảo rằng an Iterable
là một List
(giống như toString
và nhiều to<type>
phương pháp khác ). Không có gì đảm bảo với bạn rằng nó sẽ là một danh sách mới . Ví dụ: thêm dòng sau vào đầu tiện ích mở rộng: if (this is List) return this
là một cải tiến hiệu suất hợp pháp (nếu nó thực sự cải thiện hiệu suất).
Ngoài ra, vì tên của nó, mã kết quả không rõ ràng lắm.
Tôi muốn thêm tiện ích mở rộng của riêng mình để chắc chắn về kết quả và tạo mã rõ ràng hơn nhiều (giống như chúng ta có đối với mảng ):
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) }
}
Lưu ý rằng đó addAll
là cách nhanh nhất để sao chép vì nó sử dụng bản gốc System.arraycopy
trong việc triển khai ArrayList
.
Ngoài ra, hãy cẩn thận rằng điều này sẽ chỉ cung cấp cho bạn một bản sao nông .
addAll(this@copyOf)
, vì this
bên trong apply
sẽ tham chiếu đến danh sách trống mới tạo? Hoặc là hoặc mutableListOf<T>().also { it.addAll(this) }
?
Đối với một bản sao cạn, tôi đề nghị
.map{it}
Điều đó sẽ hoạt động đối với nhiều loại bộ sưu tập.
Map
s. Nó biên dịch, nhưng vì it
là một Map.Entry
, và bản sao là nông, bạn có các mục giống nhau.
Cũng giống như trong Java:
Danh sách:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Bản đồ:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
Giả sử bạn đang nhắm mục tiêu JVM (hoặc Android); Tôi không chắc nó hoạt động với các mục tiêu khác, vì nó dựa trên các hàm tạo bản sao của ArrayList và HashMap.
Tôi sẽ sử dụng các toCollection()
phương pháp khuyến nông :
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Thao tác này sẽ tạo mới MutableList
và sau đó thêm từng phần tử của bản gốc vào danh sách mới được tạo.
Kiểu suy luận ở đây sẽ là MutableList<String>
. Nếu bạn không muốn tiết lộ khả năng thay đổi của danh sách mới này, bạn có thể khai báo kiểu rõ ràng dưới dạng danh sách bất biến:
val copy: List<String> = original.toCollection(mutableListOf())
Đối với danh sách đơn giản có nhiều giải pháp bên trên.
Tuy nhiên, nó chỉ dành cho danh sách nông.
Hàm dưới đây hoạt động cho 2 chiều bất kỳ ArrayList
. ArrayList
trong thực tế, tương đương với MutableList
. Điều thú vị là nó không hoạt động khi sử dụng MutableList
kiểu rõ ràng . Nếu một người cần nhiều kích thước hơn, thì cần tạo nhiều chức năng hơn.
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
}
Demo cho Ma trận số nguyên:
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])
nó cho thấy 12
Bạn có thể sử dụng hàm ArrayList
tạo:ArrayList(list)