কোটলিনের তালিকায় "অ্যাড", "অপসারণ", মানচিত্র অনুপস্থিত "পুট", ইত্যাদি নেই?


197

জাভাতে আমরা নিম্নলিখিতগুলি করতে পারি

public class TempClass {
    List<Integer> myList = null;
    void doSomething() {
        myList = new ArrayList<>();
        myList.add(10);
        myList.remove(10);
    }
}

তবে আমরা যদি এটি নীচের মত সরাসরি কোটলিনে আবার লিখি

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}

আমি আমার তালিকা থেকে সন্ধান addএবং removeকাজ না করার ত্রুটি পেয়েছি

আমি এটি অ্যারেলিস্টে ফেলে দেওয়ার চারপাশে কাজ করি, তবে জাভা কাস্টিংয়ের প্রয়োজন হয় না, তবে এটি কাস্ট করা দরকার d এবং এটি বিমূর্ত শ্রেণীর তালিকা থাকার উদ্দেশ্যকে পরাস্ত করে

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        (myList!! as ArrayList).add(10)
        (myList!! as ArrayList).remove(10)
    }
}

জাভাতে কি করা যেতে পারে তার মতো আমার জন্য তালিকা ব্যবহার করার কোনও উপায় আছে তবে এটি কাস্ট করার দরকার নেই?


1
আপনি কী করতে পারবেন না তার জন্য কেবল একটি মন্তব্য myList = nullএবং তারপরে পরে কল ছাড়াও যোগ করুন !!। আপনি lateinitআপনার সম্পত্তির সামনে কীওয়ার্ডটি ব্যবহার করে এটি কাটিয়ে উঠতে পারেন: lateinit var myList: List<Int>এই মুহুর্তে আপনাকে তালিকাটি তাত্ক্ষণিকভাবে আরম্ভ করার প্রয়োজন হবে না তবে আপনি প্রথমটি তালিকাটি ব্যবহারের আগে এটি সংকলককে গ্যারান্টি দিয়েছিলেন যে আপনি প্রথমে এটি শুরু করবেন। এটি একটি মসৃণ সমাধান, তবে এটি আপনাকে বিকাশকারী হিসাবে একটি দায়বদ্ধ করে তোলে।
দারউইন্ড

উত্তর:


351

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

https://kotlinlang.org/docs/reference/collections.html

আপনার একটি MutableListতালিকা ব্যবহার করতে হবে ।

class TempClass {
    var myList: MutableList<Int> = mutableListOf<Int>()
    fun doSomething() {
        // myList = ArrayList<Int>() // initializer is redundant
        myList.add(10)
        myList.remove(10)
    }
}

MutableList<Int> = arrayListOf() কাজ করা উচিত।


4
সুন্দর এবং ভাল লিখিত উত্তর। আমি নীচে আমার থাকা সত্ত্বেও আপনাকে মডেল উত্তর হিসাবে বেছে নিচ্ছি :)
এলি

6
আপনি যদি তাৎক্ষণিকভাবে তালিকাটি শুরু করেন তবে আপনাকে তালিকাটি অযোগ্য করতে হবে না। আমি আপনার উত্তর সম্পাদনা করেছি।
কিরিল রাখমান

37

কোটলিনে একটি তালিকা সংগ্রহকে বিভিন্ন উপায়ে সংজ্ঞা দিচ্ছেন:

  • অপরিবর্তনীয় (কেবল পঠনযোগ্য) তালিকার সাথে অপরিবর্তনীয় পরিবর্তনশীল:

    val users: List<User> = listOf( User("Tom", 32), User("John", 64) )


  • পরিবর্তনীয় তালিকার সাথে অপরিবর্তনীয় পরিবর্তনশীল:

    val users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )

    বা প্রাথমিক মান ছাড়াই - খালি তালিকা এবং সুস্পষ্ট পরিবর্তনশীল ধরণের ছাড়াই:

    val users = mutableListOf<User>()
    //or
    val users = ArrayList<User>()
    • আপনি তালিকায় আইটেম যুক্ত করতে পারেন:
      • users.add(anohterUser) অথবা
      • users += anotherUser(এটি ছড়ের নীচে users.add(anohterUser))


  • পরিবর্তনীয় তালিকার সাথে পরিবর্তনীয় পরিবর্তনশীল:

    var users: List<User> = listOf( User("Tom", 32), User("John", 64) )

    বা প্রাথমিক মান ছাড়াই - খালি তালিকা এবং সুস্পষ্ট পরিবর্তনশীল ধরণের ছাড়াই:

    var users = emptyList<User>()
    • দ্রষ্টব্য: আপনি তালিকাতে * আইটেম যুক্ত করতে পারেন:
      • users += anotherUser - * এটি নতুন অ্যারেলিস্ট তৈরি করে এবং এটি নির্ধারণ করে users


  • পরিবর্তনীয় তালিকার সাথে পরিবর্তনীয় পরিবর্তনশীল:

    var users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )

    বা প্রাথমিক মান ছাড়াই - খালি তালিকা এবং সুস্পষ্ট পরিবর্তনশীল ধরণের ছাড়াই:

    var users = emptyList<User>().toMutableList()
    //or
    var users = ArrayList<User>()
    • দ্রষ্টব্য: আপনি তালিকায় আইটেম যুক্ত করতে পারেন:
      • users.add(anohterUser)
      • কিন্তু ব্যবহার না users += anotherUser

        ত্রুটি: কোটলিন: অ্যাসাইনমেন্ট অপারেটরদের অস্পষ্টতা:
        পাবলিক অপারেটর ফান
        কালেকশন.প্লাস (উপাদান: স্ট্রিং): তালিকা কোটলিন কোডে সংজ্ঞায়িত করা হয়েছে @ ইনলাইন অনলাইনে পাবলিক ইনলাইন অপারেটর ফান মিউটেবল কালেকশন.প্লাসঅ্যাসাইন (উপাদান: স্ট্রিং): ইউনিট কোটলিনকলেকশনগুলিতে সংজ্ঞায়িত


আরও দেখুন: https://kotlinlang.org/docs/references/collections.html


9

মিউটেবললিস্ট ব্যবহারের উপরোক্ত সমস্ত উত্তরের সাথে সম্মত হন তবে আপনি তালিকা থেকে যোগ / অপসারণ করতে পারেন এবং নীচের মত একটি নতুন তালিকা পেতে পারেন।

val newListWithElement = existingList + listOf(element)
val newListMinusElement = existingList - listOf(element)

অথবা

val newListWithElement = existingList.plus(element)
val newListMinusElement = existingList.minus(element)

8

স্পষ্টতই, কোটলিনের ডিফল্ট তালিকাটি পরিবর্তনযোগ্য। পরিবর্তিত হতে পারে এমন একটি তালিকা পেতে, নীচের মতো মিউটেবললিস্ট ব্যবহার করা উচিত

class TempClass {
    var myList: MutableList<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}

আপডেট হওয়া সত্ত্বেও, আপনি যে তালিকার পরিবর্তন করতে চান তা তালিকার জন্য মিউটেবললিস্ট ব্যবহার করার পরামর্শ দেওয়া হয় না। কীভাবে কেবলমাত্র পঠনযোগ্য সংগ্রহের জন্য আরও ভাল কোডিং সরবরাহ করা হয় তার জন্য https://hackernoon.com/read-only-col લેક્----clinlin - leads-to -better-coding- 40cdfa4c6359 বোঝায় ।


আপনি ব্যবহার সম্পর্কে সঠিক MutableList, তবে এটি আরম্ভ করে nullকাজ করবে না। কেবলমাত্র নিরাপদ বা নন-নাল জোর দেওয়া কলগুলি কোনও প্রকারের নালযোগ্য রিসিভারে অনুমোদিত MutableList<Int>
ফুলভিও

এটি আমার শেষের দিকে কাজ করে, এবং কোনও ত্রুটি পাওয়া যায় নি। আমার যখন এটির দরকার হয় না হলে আমার এটি আরম্ভ করার দরকার নেইdoSomething
এলি

@ এলি আমি জানি এটি একটি পুরানো উত্তর এবং প্রশ্ন, তবে lateinitতালিকাটি নালাগুলি তৈরির পরিবর্তে ব্যবহার করা এই সমস্যাটি সম্পর্কে সঠিক উপায়। lateinitকোটলিনের শুরু থেকেই যুক্ত হয়েছিল কিনা তা মনে রাখবেন না , তবে আজকাল এটি অবশ্যই ব্যবহারের সমাধান :-)
দারউইন্ড

5

কোটলিনে আপনাকে ব্যবহার করতে হবে MutableListবা ArrayList

আসুন দেখি কীভাবে MutableListকাজের পদ্ধতিগুলি :

var listNumbers: MutableList<Int> = mutableListOf(10, 15, 20)
// Result: 10, 15, 20

listNumbers.add(1000)
// Result: 10, 15, 20, 1000

listNumbers.add(1, 250)
// Result: 10, 250, 15, 20, 1000

listNumbers.removeAt(0)
// Result: 250, 15, 20, 1000

listNumbers.remove(20)
// Result: 250, 15, 1000

for (i in listNumbers) { 
    println(i) 
}

আসুন দেখি কীভাবে ArrayListকাজের পদ্ধতিগুলি :

var arrayNumbers: ArrayList<Int> = arrayListOf(1, 2, 3, 4, 5)
// Result: 1, 2, 3, 4, 5

arrayNumbers.add(20)
// Result: 1, 2, 3, 4, 5, 20

arrayNumbers.remove(1)
// Result: 2, 3, 4, 5, 20

arrayNumbers.clear()
// Result: Empty

for (j in arrayNumbers) { 
    println(j) 
}

4

আপনি এটির মতো নতুন তৈরি করতে পারেন।

var list1 = ArrayList<Int>()
var list2  = list1.toMutableList()
list2.add(item)

এখন আপনি list2 ব্যবহার করতে পারেন, আপনাকে ধন্যবাদ।


3

https://kotlinlang.org/docs/reference/collections.html

উপরের লিঙ্ক অনুসারে তালিকা <E> কোটলিনে অপরিবর্তনীয়। তবে এটি কাজ করবে:

var list2 = ArrayList<String>()
list2.removeAt(1)

এর অর্থ এটি list2একটি পরিবর্তনীয় তালিকা, stackoverflow.com/questions/43114367/… দেখুন
কুলমাইন্ড

2

বিল্ডারদের মধ্যে মিউটিলিটি কনফিগার করা

এখানে শীর্ষস্থানীয় উত্তরগুলি সঠিকভাবে পড়ার মধ্যে কোটলিনের পার্থক্যের সাথে সঠিকভাবে কথা বলেছে List(দ্রষ্টব্য: এটি কেবল পঠনযোগ্য, "অপরিবর্তনীয়" নয় ) এবং MutableList

সাধারণভাবে, কেবলমাত্র পঠনযোগ্য তালিকাগুলি ব্যবহার করার জন্য প্রচেষ্টা করা উচিত, তবে, নির্মাণকালীন সময়ে পরিবর্তনটি এখনও প্রায়শই কার্যকর হয় , বিশেষত যখন অ-কার্যকরী ইন্টারফেসের সাথে তৃতীয় পক্ষের লাইব্রেরিগুলি নিয়ে কাজ করে। যেসব ক্ষেত্রে বিকল্প নির্মাণের কৌশলগুলি উপলভ্য নয় যেমন listOfসরাসরি ব্যবহার করা বা কোনও কার্যকরী কাঠামো প্রয়োগ করা foldবা এর মতো reduceএকটি সাধারণ "বিল্ডার ফাংশন" নিম্নরূপভাবে একটি অস্থায়ী পরিবর্তনযোগ্য থেকে কেবল পঠন তালিকা তৈরি করে:

val readonlyList = mutableListOf<...>().apply {
  // manipulate your list here using whatever logic you need
  // the `apply` function sets `this` to the `MutableList`
  add(foo1)
  addAll(foos)
  // etc.
}.toList()

এবং এটি সুন্দরভাবে পুনরায় ব্যবহারযোগ্য ইনলাইন ইউটিলিটি ফাংশনে আবদ্ধ হতে পারে:

inline fun <T> buildList(block: MutableList<T>.() -> Unit) = 
  mutableListOf<T>().apply(block).toList()

যাকে এরকম বলা যেতে পারে:

val readonlyList = buildList<String> {
  add("foo")
  add("bar")
}

এখন, সমস্ত পরিবর্তনীয়তা কেবলমাত্র পঠনযোগ্য তালিকা তৈরির জন্য ব্যবহৃত একটি ব্লক স্কোপকে বিচ্ছিন্ন করা হয়েছে এবং আপনার বাকী কোডটি কেবলমাত্র পঠনযোগ্য তালিকা ব্যবহার করে যা বিল্ডার থেকে আউটপুট।

আপডেট : Kotlin 1.3.70 পর্যন্ত সঠিক buildListফাংশন উপরে প্রাপ্তিসাধ্য একটি পরীক্ষামূলক ফাংশন হিসাবে মান লাইব্রেরিতে তার অনুরূপ উদাহরণ সহ buildSetএবং buildMapHttps://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ দেখুন ।


ধন্যবাদ এবং ভাল ব্যবসা যুক্তি দিয়ে আবেদন পদ্ধতি মধ্যে, এমনকি ব্যবহৃত anotherList.ForEach {অ্যাড (foo বিন্যাস)} .appy ভিতরে কাজ {}
BENN1TH

1

অপরিবর্তনীয় ডেটা ধারণা হিসাবে, সম্ভবত এটি একটি ভাল উপায়:

class TempClass {
    val list: List<Int> by lazy {
        listOf<Int>()
    }
    fun doSomething() {
        list += 10
        list -= 10
    }
}

1

listদ্বারা immutableহয় Default, আপনি ArrayListপরিবর্তে ব্যবহার করতে পারেন । এটার মত :

 val orders = arrayListOf<String>()

তারপরে আপনি add/deleteনীচের মত এটি থেকে আইটেমগুলি করতে পারেন :

orders.add("Item 1")
orders.add("Item 2")

ডিফল্টরূপে ArrayListহয় mutableতাই আপনি এটি উপর অপারেশন সম্পাদন করতে পারবেন।

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