স্কেলার একটি সেক এবং একটি তালিকার মধ্যে পার্থক্য


299

আমি অনেক উদাহরণে দেখেছি যে কখনও কখনও সিক ব্যবহার করা হয়, অন্য সময় তালিকা হয় ...

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

উত্তর:


408

জাভা শর্তে, স্কালার Seqজাভা হবে List, এবং স্কালার Listজাভা হবে LinkedList

দ্রষ্টব্য এটি Seqএকটি traitযা জাভা এর সমতুল্য interface, তবে আপ-আপ এবং আসন্ন ডিফেন্ডার পদ্ধতির সমতুল্য। স্কালা এর Listএকটি বিমূর্ত শ্রেণি যা দ্বারা প্রসারিত Nilএবং ::, যা এর কংক্রিট বাস্তবায়ন List

সুতরাং, যেখানে জাভার Listএকটি হল interface, Scala এর Listএকটি বাস্তবায়ন হয়।

তার পরেও যে, Scala এর Listঅপরিবর্তনীয়, যা ক্ষেত্রে নয় LinkedList। প্রকৃতপক্ষে, জাভাতে অপরিবর্তনীয় সংগ্রহগুলির সমতুল্য নেই (কেবলমাত্র পঠনযোগ্য বিষয়টিই গ্যারান্টি দেয় যে নতুন অবজেক্টটি পরিবর্তন করা যাবে না, তবে আপনি এখনও পুরানোটি পরিবর্তন করতে পারেন, এবং, "কেবলমাত্র পঠনযোগ্য")।

Scala এর Listঅত্যন্ত কম্পাইলার এবং লাইব্রেরী দ্বারা অপ্টিমাইজ করা হয়, এবং এটি কার্যকরী প্রোগ্রামিং একটি মৌলিক ডাটা টাইপ আছে। তবে এর সীমাবদ্ধতা রয়েছে এবং এটি সমান্তরাল প্রোগ্রামিংয়ের পক্ষে অপর্যাপ্ত। এই দিনগুলির Vectorচেয়ে ভাল পছন্দ List, তবে অভ্যাসটি ভাঙ্গা শক্ত।

Seqক্রমগুলির জন্য একটি ভাল সাধারণীকরণ, সুতরাং আপনি যদি ইন্টারফেসগুলিতে প্রোগ্রাম করেন তবে আপনার এটি ব্যবহার করা উচিত। নোট সেখানে আসলে তিন তাদের আছে: collection.Seq, collection.mutable.Seqএবং collection.immutable.Seq, এবং এটি আধুনিক এক যে "ডিফল্ট" সুযোগ আমদানি হয়।

এছাড়াও আছে GenSeqএবং ParSeq। পরবর্তী পদ্ধতিগুলি যেখানে সম্ভব সেখানে সমান্তরালভাবে চলতে থাকে, যদিও পূর্ববর্তী উভয়েরই পিতা বা মাতা হয় Seqএবং ParSeqযখন কোনও কোডের সমান্তরালতার বিষয়টি বিবেচনা করে না তখন এটি উপযুক্ত সাধারণীকরণ হয়। এগুলি উভয়ই তুলনামূলকভাবে নতুনভাবে পরিচিত, তাই লোকেরা এগুলিকে এখনও বেশি ব্যবহার করে না।


3
আর "জাভাতে অপরিবর্তনীয় সংগ্রহের সমপরিমাণ নেই" , যদিও Stringএটি সংগ্রহ নয়, এটি জাভা প্রোগ্রামারদের সাথে পরিচিত অপরিবর্তনীয় শ্রেণির উদাহরণ।
huynhjl

15
@ হুইনহজল এটি পয়েন্টের পাশে। আমি জাভাতে যা বিদ্যমান এবং স্কালায় যা আছে তার মধ্যে সমান্তরাল চিত্র আঁকছিলাম এবং জাভাতে কেবল পরিবর্তনযোগ্য / অপরিবর্তনীয় সংগ্রহের ধারণা নেই।
ড্যানিয়েল সি সোব্রাল

2
জাভা আসলে অপরিবর্তনীয় সংগ্রহ সমতুল্য। এটি 'ভাল বিজ্ঞাপনিত' নয় তবে এটি সেখানে রয়েছে এবং আপনি যখন জেনেরিকগুলি ভারী ব্যবহার করেন তখন আপনি সম্ভবত কিছুটিকে আঘাত করতে পারেন UnsupportedOperationException। জাভাতে একটি অপরিবর্তনীয় তালিকা তৈরি করতে আপনি সংগ্রহে.অনুবর্তিতযোগ্য তালিকা () ব্যবহার করেন এবং একইভাবে সেটস, মানচিত্র ইত্যাদির জন্য অন্যান্য পদ্ধতি রয়েছে ডকস.অরাকল
জাভাসে /

27
@jbx সত্য নয় আপনি এই পদ্ধতি ব্যবহার করেন, তাহলে আপনি কিছু একটি বস্তু যে পদ্ধতি এটি পরিবর্তন যে ব্যতিক্রম নিক্ষেপ করা হবে, কিন্তু না একটি পেতে অপরিবর্তনীয় অবজেক্ট। আনমোডিফিকেশনযোগ্য অবজেক্টটি তৈরি হওয়ার পরে যদি আসল অবজেক্টটি সংশোধিত হয়, অবিস্মরণীয় অবজেক্টটি এটি প্রতিফলিত করবে। সুতরাং, অবিচ্ছেদ্য, হ্যাঁ, পরিবর্তনযোগ্য, না।
ড্যানিয়েল সি সোব্রাল

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

81

একটি সিক একটি আইটেবল যা উপাদানগুলির একটি সংজ্ঞায়িত ক্রম থাকে। সিকোয়েন্সগুলি ক্রম apply()দৈর্ঘ্য পর্যন্ত 0 থেকে শুরু করে সূচকের জন্য একটি পদ্ধতি সরবরাহ করে। সিকের ক্যু, রেঞ্জ, তালিকা, স্ট্যাক এবং লিংকডলিস্ট সহ অনেকগুলি সাবক্লাস রয়েছে।

একটি তালিকা একটি সেক যা অপরিবর্তনীয় লিঙ্ক তালিকা হিসাবে প্রয়োগ করা হয়। সর্বশেষে ফার্স্ট-আউট (LIFO) অ্যাক্সেস নিদর্শনগুলির ক্ষেত্রে এটি সবচেয়ে ভাল ব্যবহৃত।

এখানে স্ক্যালাল এফএকিউ থেকে সম্পূর্ণ সংগ্রহ শ্রেণি শ্রেণিবিন্যাস :

এখানে চিত্র বর্ণনা লিখুন


2
অ্যারে (এবং অ্যারেবফার) কোথায়? এটি কোনও ধরণের উপার্জনযোগ্য নয়
পিটার ক্রাউস

23

Seqএকটি বৈশিষ্ট্য যা Listকার্যকর করে।

আপনি যদি নিজের ধারকটিকে এটি হিসাবে সংজ্ঞায়িত করেন তবে আপনি এমন Seqকোনও ধারক ব্যবহার করতে পারেন যা Seqবৈশিষ্ট্য প্রয়োগ করে।

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6

মনে রাখবেন যে

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

এর জন্য কেবল একটি ছোট হাত:

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

যদি ধারক প্রকারটি নির্দিষ্ট না করা হয় তবে অন্তর্নিহিত ডেটা স্ট্রাকচারটি ডিফল্ট হয় List


18

স্কালায়, একটি তালিকা সেক থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, তবে পণ্য প্রয়োগ করে ; এখান থেকে সঠিক সংজ্ঞা নেই তালিকা :

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[নোট: প্রকৃত সংজ্ঞা । একটি বাচ্চা ও করতে Scala এর খুব শক্তিশালী সংগ্রহ ফ্রেমওয়ার্ক ব্যবহার হইয়া এই রকম আরো জটিল বিট অনুক্রম হল]


0

যেমন @ ড্যানিয়েল-সি-সোব্রাল বলেছিলেন, তালিকাটি বৈশিষ্ট সিককে প্রসারিত করে এবং একটি বিমূর্ত শ্রেণি দ্বারা প্রয়োগ করা হয় scala.collection.immutable.$colon$colon(বা ::সংক্ষিপ্তের জন্য), তবে প্রযুক্তিগত দিকটি বিবেচনা করে মনে রাখবেন যে আমরা ব্যবহার করি বেশিরভাগ তালিকা এবং সিকগুলি শুরু হয় Seq(1, 2, 3)বা List(1, 2, 3)উভয়ই প্রত্যাবর্তন করে scala.collection.immutable.$colon$colonসুতরাং, একটি লিখতে পারেন:

var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]

ফলস্বরূপ, আমি কেবলমাত্র সেই বিষয়গুলির চেয়ে তর্ক করব যা আপনি যে পদ্ধতিগুলি প্রকাশ করতে চান তা উদাহরণস্বরূপ আপনি Seend ::থেকে অপ্রয়োজনীয় তালিকার তালিকা থেকে ব্যবহার করতে পারেন +:এবং আমি ব্যক্তিগতভাবে ডিফল্টরূপে সিকের সাথে লেগে থাকি end

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