কোটলিনে কীভাবে কোনও তালিকা ক্লোন বা অনুলিপি করবেন


111

কোটলিনে কীভাবে তালিকা কপি করবেন?

আমি ব্যাবহার করছি

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

কোন সহজ উপায় আছে?


4
আমি মনে করি আপনার সমাধানটি ইতিমধ্যে সবচেয়ে সহজ উপায়, যদি আপনার গভীর ক্লোনিংয়ের প্রয়োজন না হয়।
সর্দার সমানসিওলু

একটি তালিকা অনুলিপি করা কেবল আইটেম রেফারেন্স অনুলিপি। আইটেমগুলি তারা ক্লোন করে না। অনুলিপি করতে চাইলে তালিকাগুলি অনুলিপি করার সময় আইটেমগুলি ক্লোন করতে ভুলবেন না।
কুলমাইন্ড

উত্তর:


156

এটি কাজ করে।

val selectedSeries = series.toMutableList()

6
val selectedSeries = series.toList()এটি কার্যকর করে কারণ এটি toMutableList()এর বাস্তবায়নে কল করে।
ফ্লাভিও ফারিয়া

4
@ ফ্লাভিওফারিয়া সবেমাত্র এটি পরীক্ষা করে দেখেছেন ===এবং toList()সংগ্রহটি অনুলিপি করেন না, তবে toMutableList()করেন
পিপারমিন্ট ধান

4
@ পেপারমিন্টপ্যাডি খালি তালিকার ব্যতীত এটি অনুলিপি করে । উত্স খালি থাকলে, Iterable.toList()ফেরত দেয় emptyList(), যা সর্বদা একই (অপরিবর্তনীয়) বস্তুটি দেয়। সুতরাং আপনি যদি পরীক্ষা করে emptyList()দেখেন তবে একই জিনিসটি ফিরে পাবেন।
লরেন্স গনসাল্ভেস

5
এটি একটি ভাল উত্তর নয়, এবং অবশ্যই সঠিক উত্তর নয়, ভবিষ্যতের বাস্তবায়নগুলি পরিবর্তনের কোনও গ্যারান্টি নেই, যতক্ষণ না নির্দিষ্ট পদ্ধতিতে এই পদ্ধতি কলটি সর্বদা একটি নতুন অনুলিপি ফিরে আসবে না।
ভড়গব

4
@ ব্রুনোজেসিএম, এখন আর এটি হয় না। কোটলিন ডক্স জানিয়েছে যে toMutableList()একটি নতুন তালিকা ফিরে আসে , "এই সংগ্রহের সমস্ত উপাদান দিয়ে ভরাট নতুন মিউটেবললিস্ট ফিরিয়ে দেয়"।
পের নিলস আমসেন

26

তুমি ব্যবহার করতে পার

তালিকা -> টু লিস্ট ()

অ্যারে -> টু অ্যারে ()

অ্যারেলিস্ট -> টু অ্যারে ()

পরিবর্তনীয় তালিকা -> থেকে পরিবর্তনযোগ্য তালিকা ()


উদাহরণ:

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

16

আমি দুটি বিকল্প উপায় নিয়ে আসতে পারি:

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

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

আপডেট: নতুন টাইপ ইনফারেন্স ইঞ্জিন সহ (কোটলিন ১.৩ এ অপ্ট-ইন করুন), আমরা প্রথম উদাহরণে জেনেরিক টাইপ প্যারামিটারটি বাদ দিতে পারি এবং এটিতে:

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

FYI. নতুন ইনফারেন্সটি বেছে নেওয়ার উপায় হ'ল kotlinc -Xnew-inference ./SourceCode.ktকমান্ড লাইন বা kotlin { experimental { newInference 'enable'}গ্রেডল for নতুন টাইপ অনুমান সম্পর্কে আরও তথ্যের জন্য, এই ভিডিওটি দেখুন: কোটলিনকনফ 2018 - স্বেতলানা ইসাকোভা রচিত নতুন টাইপ অনুমান এবং সম্পর্কিত ভাষা বৈশিষ্ট্য , বিশেষত 'বিল্ডারদের জন্য অনুমান' 30 এ '


ইমোতে 2 টি উত্তর বিভক্ত করা উচিত, যেহেতু আমি মনে করি প্রথমটি সঠিক, তবে উত্তরটির মধ্যে কিছু সৌন্দর্যের অভাব রয়েছে।
হলগার ব্র্যান্ডেল

@ জ্যাকব উ: দ্বিতীয় সমাধানে * চিহ্নটি কোনও ত্রুটি ঘটেনি তা দেখে আমি অবাক হয়েছি। এটার কাজ কি? আমি "আনারি গুণা" দিয়ে একটি অনুসন্ধান করেছি তবে কিছুই পাইনি।
লেন্সফ্লেরে

4
@ লেন্সফ্লেয়ার * এর অর্থ পৃথক আইটেমগুলিতে একটি অ্যারের বিনষ্ট করা, যেমন মিউটেবললিস্টফ (* [১, ২, ৩]) এর অর্থ মিউটেবললিস্ট অফ (১, ২, ৩), এটি বৈরাগের বিপরীত অপারেশনের মতো
জ্যাকব উউ

4
@ জ্যাকব উ: আপনাকে ধন্যবাদ আপনার উত্তর দিয়ে, আমি জানতে সক্ষম হয়েছি যে অপারেটরটিকে "স্প্রেড অপারেটর" বলা হয়। আমি দেখতে পাচ্ছি যে এটি কীভাবে কিছু প্যারামিটারগুলিকে অ্যারেগুলির সাথে ভ্যারাগস তালিকায় একত্রিত করে সহায়তা করে। তবে আপনার উদাহরণে এটির কী লাভ? এটি দ্রুত বা কিছু? বা সংগ্রহটি অনুলিপি করা হয়েছে কিনা তা নিশ্চিত করার মূল চাবিকাঠি?
লেন্সফ্লেরে

@ লেন্সফ্লেয়ার আমি মনে করি সুবিধাটি কেবল সিনট্যাক্স - কোডটি সংক্ষিপ্ত, এবং কোনও স্পষ্টত জেনেরিক প্রকারের প্রয়োজন নেই (যেমন আমার প্রথম উদাহরণে)। দৃশ্যের পিছনে, আমি বিশ্বাস করি কোডটি অ্যারে অপারেশনে সংকলিত, সুতরাং পারফরম্যান্স একই হওয়া উচিত।
জ্যাকব ওউ

14

যদি আপনার তালিকায় কোটলিন ডেটা ক্লাস থাকে তবে আপনি এটি করতে পারেন

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

আপনি যদি অ্যারেলিস্টের কেবলমাত্র 1 টি বৈশিষ্ট্যটিকে অন্য অ্যারেলিস্টে অনুলিপি করতে চান?
আহমদ শাহওয়াইজ

9

আপনি সরবরাহিত এক্সটেনশনটি ব্যবহার করতে পারেন 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), কারণ thisভিতরে applyসদ্য নির্মিত খালি তালিকার কথা উল্লেখ করবে? হয় নাকি mutableListOf<T>().also { it.addAll(this) }?
ফ্রাঙ্কো লিওন টোকালিć

5

অগভীর কপির জন্য, আমি পরামর্শ দিই

.map{it}

এটি বিভিন্ন ধরণের সংগ্রহের জন্য কাজ করবে।


4
মনে রাখবেন এটি Maps এর জন্য কাজ করে না । এটি সংকলন করে, তবে যেহেতু এটি itএকটি Map.Entryএবং অনুলিপি অগভীর, আপনার একই প্রবেশিকা রয়েছে।
noamtm

4
@ নমঃ হ্যাঁ, অগভীর অনুলিপিটির সাথে আমার এটিই বোঝা যাচ্ছে। এই পদ্ধতিটি এন্ট্রিগুলিকে কখনই অনুলিপি করবে না। এটি কেবল একই এন্ট্রি সহ সংগ্রহের একটি অনুলিপি তৈরি করবে। মানচিত্র এখানে বিশেষ কিছু নয়।
লেন্সফ্লেয়ার

4
আমার বক্তব্যটি হ'ল যদিও এটি মানচিত্রেও এটি ব্যবহার করতে লোভনীয়, এবং এটি সংকলন করে কাজ করে বলে মনে হচ্ছে - এটি সত্যিই কাজ করে না।
noamtm

4

ঠিক জাভা মত:

তালিকা:

    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)

ধরে নিচ্ছেন আপনি জেভিএম (বা অ্যান্ড্রয়েড) কে টার্গেট করছেন; আমি নিশ্চিত নই যে এটি অন্যান্য লক্ষ্যগুলির জন্য কাজ করে, কারণ এটি অ্যারেলিস্ট এবং হ্যাশম্যাপের অনুলিপি নির্মাণকারীদের উপর নির্ভর করে।


2

আমি ব্যবহার করেন এক্সটেনশন পদ্ধতি :toCollection()

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

এটি একটি নতুন তৈরি করবে MutableListএবং তারপরে নতুন-তৈরি তালিকায় মূলটির প্রতিটি উপাদান যুক্ত করবে।

এখানে অনুমান করা টাইপ হবে MutableList<String>। আপনি যদি এই নতুন তালিকার পরিবর্তনের বিষয়টি প্রকাশ করতে না চান তবে আপনি প্রকারটিকে অপরিবর্তনীয় তালিকা হিসাবে স্পষ্টভাবে ঘোষণা করতে পারেন:

val copy: List<String> = original.toCollection(mutableListOf())


0

সাধারণ তালিকার জন্য উপরে অনেকগুলি সঠিক সমাধান রয়েছে।

তবে এটি কেবল অগভীর তালিকার জন্য।

নীচের ফাংশনটি কোনও 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


-2

কোটলিনে অনুলিপি তালিকা জন্য কোড নীচে চেষ্টা করুন

arrayList2.addAll(arrayList1.filterNotNull())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.