স্কালার তালিকার শেষে একটি উপাদান যুক্ত করা


223

এটি একটি মূ .় প্রশ্নের মতো মনে হচ্ছে, তবে ইন্টারনেটে যা কিছু পেয়েছি তা ট্র্যাশই ছিল। আমি কেবল Tতালিকায় টাইপের কোনও উপাদান যুক্ত করতে পারি না List[T]। আমি চেষ্টা করেছিলাম myList ::= myElementতবে মনে হয় এটি একটি অদ্ভুত অবজেক্ট তৈরি করে এবং myList.lastসর্বদা অ্যাক্সেস করা তালিকার ভিতরে থাকা প্রথম উপাদানটিকে ফেরত দেয়।

উত্তর:


394
List(1,2,3) :+ 4

Results in List[Int] = List(1, 2, 3, 4)

নোট করুন যে এই অপারেশনটিতে ও (এন) এর জটিলতা রয়েছে। আপনার যদি এই ঘন ঘন অপারেশন প্রয়োজন হয় বা দীর্ঘ তালিকাগুলির জন্য অন্য কোনও ডেটা টাইপ (উদাহরণস্বরূপ একটি লিস্টবফার) ব্যবহার করে বিবেচনা করুন।


7
কোনও ও (2 * এন) নেই, অ্যাসিপটোটিক জটিলতার জন্য ধ্রুবক কারণগুলি উপেক্ষা করা হয়। আমি মনে করি যে Listএটি একটিতে রূপান্তরিত হয়েছে ListBuffer, উপাদানটি সংযোজন করা হয়েছে এবং ListBufferফিরে রূপান্তরিত হয়েছে (বেশ কিছুটা পছন্দ মতো Stringএবং StringBuilderজাভাতেও) তবে এটি কেবল অনুমান।
ল্যান্ডেই

2
এটি ও (এন) কারণ আপনাকে শেষ উপাদান পয়েন্টারে পৌঁছানোর জন্য তালিকাটি পুরোপুরি অতিক্রম করতে হবে এবং এটিতে সর্বশেষ উপাদান পয়েন্টার পয়েন্ট তৈরি করে উপাদান যুক্ত করতে সক্ষম হবেন।
পিসারুক

39
@ পিসারুক যদি এমনটি হয় তবে কেউই কেবল মাথা এবং লেজের দিকে একটি পয়েন্টার বজায় রাখতে পারতেন। তবে স্কেলে তালিকাটি অপরিবর্তনীয়, এর অর্থ তালিকার শেষ উপাদানটি "সংশোধন" করতে প্রথমে এর অনুলিপি তৈরি করা দরকার। এটি অনুলিপি যা ও (এন) - এটি তালিকার ট্র্যাভারসাল নয়।

2
আমি বিশ্বাস করি যে এটি ও (এন) কেবলমাত্র একটি নতুন তালিকা তৈরি করে
রাফায়েল রসি

3
কনস অপারেটরের জটিলতা O (1) রয়েছে, কারণ এটি তালিকার "অভিযুক্ত" পাশে কাজ করে।
ল্যান্ডেই

67

কারণ এটি আপনার করা উচিত নয় (অন্তত একটি পরিবর্তনযোগ্য তালিকার সাথে)। আপনার যদি সত্যই কোনও ডাটা স্ট্রাকচারের শেষে কোনও উপাদান যুক্ত করতে হয় এবং এই ডেটা স্ট্রাকচারটি সত্যই একটি তালিকা হওয়া প্রয়োজন এবং এই তালিকাটি সত্যই অপরিবর্তনীয় হতে হবে তবে এটি করতে চেষ্টা করুন:

(4 :: List(1,2,3).reverse).reverse

বা যে:

List(1,2,3) ::: List(4)

অনেক ধন্যবাদ! ঠিক এটিই আমি অনুসন্ধান করছিলাম। আমি আপনার উত্তর থেকে অনুমান করি আমার এটি করা উচিত নয় যদিও ... আমি আমার কাঠামোটি সংশোধন করব এবং আমি কী করতে পারি তা দেখতে পাবো। আবার ধন্যবাদ.
মাসিয়ার

6
আপনি যদি অপরিবর্তনযোগ্যতা এবং দক্ষ সংযোজন চান তবে @ মাশিয়ার একটি ভেক্টর ব্যবহার করুন। স্কেলা-lang.org/docu/files/collections-api/collections.html- এর
আরজান

29
"প্রিপেন্ডিং দিয়ে তালিকাটি তৈরি করুন এবং তারপরে বিপরীত করুন" একটি দরকারী ধরণ যা আপনার কাছে যুক্ত করার মতো অনেক উপাদান রয়েছে তবে আমি মনে করি না যে কোনও একটি উপাদানকে যুক্ত করার ক্ষেত্রে আপনি যেমন করেন তেমন প্রয়োগ করা ভাল ধারণা don't বিদ্যমান তালিকা "ডাবল রিভার্স" ট্রিক তালিকাকে দু'বার পুনর্নির্মাণ করে, যদিও :+এটি অকার্যকর, কেবল একবার এটি পুনর্নির্মাণ করে।
নিকোলাস পেয়েট

25

স্কালার তালিকা সংশোধন করার জন্য ডিজাইন করা হয়নি। আসলে, আপনি কোনও স্কেলে উপাদান যুক্ত করতে পারবেন না List; এটি জাভা স্ট্রিংয়ের মতো একটি অপরিবর্তনীয় ডেটা কাঠামো । আপনি যখন স্কেলে "তালিকার সাথে একটি উপাদান যুক্ত করেন" আসলে আপনি যা করেন তা হ'ল বিদ্যমান তালিকা থেকে একটি নতুন তালিকা তৈরি করা । (উৎস)

এই জাতীয় ব্যবহারের ক্ষেত্রে তালিকাগুলি ব্যবহার করার পরিবর্তে, আমি হয় একটি ArrayBufferবা একটি ব্যবহার করার পরামর্শ দিই ListBuffer। এই ডেটাস্ট্রাকচারগুলি নতুন উপাদান যুক্ত করার জন্য ডিজাইন করা হয়েছে।

অবশেষে, আপনার সমস্ত ক্রিয়াকলাপ শেষ হওয়ার পরে, বাফারটিকে পরে তালিকায় রূপান্তর করা যায়। নিম্নলিখিত REPL উদাহরণ দেখুন:

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var fruits = new ListBuffer[String]()
fruits: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> fruits += "Apple"
res0: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple)

scala> fruits += "Banana"
res1: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana)

scala> fruits += "Orange"
res2: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana, Orange)

scala> val fruitsList = fruits.toList
fruitsList: List[String] = List(Apple, Banana, Orange)

3

এটি উত্তরের একটির মতো তবে ভিন্নভাবে:

scala> val x=List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> val y=x:::4::Nil
y: List[Int] = List(1, 2, 3, 4)

2

আমরা দুটি তালিকা সংযোজন বা সংশোধন করতে পারি বা তালিকা এবং অ্যারে সংযোজন
:

var l = List(1,2,3)    
l=l:+4 
Result : 1 2 3 4  
var ar = Array(4,5,6)    
for(x<-ar)    
{ l=l:+x}  
  l.foreach(println)

Result:1 2 3 4 5 6

Prepending:

var l = List[Int]()  
   for(x<-ar)  
    { l=x::l } //prepending    
     l.foreach(println)   

Result:6 5 4 1 2 3

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