আমি কীভাবে একটি অনুক্রমের দ্বারা ক্রম দুটি তালিকায় বিভক্ত করব?
বিকল্প: আমি নিজের পদ্ধতি ব্যবহার করতে filterএবং filterNotলিখতে পারি, তবে এর চেয়ে ভাল আরও সাধারণ (অন্তর্নির্মিত) কোনও পদ্ধতি নেই?
আমি কীভাবে একটি অনুক্রমের দ্বারা ক্রম দুটি তালিকায় বিভক্ত করব?
বিকল্প: আমি নিজের পদ্ধতি ব্যবহার করতে filterএবং filterNotলিখতে পারি, তবে এর চেয়ে ভাল আরও সাধারণ (অন্তর্নির্মিত) কোনও পদ্ধতি নেই?
উত্তর:
partitionপদ্ধতি ব্যবহার করে :
scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))
_ % 2 == 0।
ভালো partitionজিনিস আপনি চেয়েছিলেন ছিল - সেখানে অন্য পদ্ধতি যে দুই একটি তালিকা বিভক্ত করার জন্য একটি বিধেয় ব্যবহার আছে: span।
প্রথমটি, পার্টিশনটি সমস্ত "সত্য" উপাদানকে একটি তালিকায় রাখবে এবং অন্যগুলি দ্বিতীয় তালিকায় রাখবে।
স্প্যান সমস্ত উপাদানকে একটি তালিকায় রাখবে যতক্ষণ না কোনও উপাদান "মিথ্যা" না হয় (ভবিষ্যদ্বাণী অনুসারে)। সেই বিন্দু থেকে এগিয়ে এটি উপাদানগুলিকে দ্বিতীয় তালিকায় রাখবে।
scala> Seq(1,2,3,4).span(x => x % 2 == 0)
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4))
আপনি স্কেলএক্স.আরএটি একবার দেখতে চান - এটি আপনাকে তাদের স্বাক্ষরের দ্বারা ফাংশনগুলির জন্য স্কালার স্ট্যান্ডার্ড লাইব্রেরি অনুসন্ধান করতে দেয়। উদাহরণস্বরূপ, নিম্নলিখিত টাইপ করুন:
List[A] => (A => Boolean) => (List[A], List[A])
আপনি বিভাজন দেখতে পাবেন ।
আপনার যদি কিছু অতিরিক্ত অতিরিক্ত প্রয়োজন হয় তবে আপনি ফোল্ডফেল্টও ব্যবহার করতে পারেন। আমি যখন এই বিভাগটি কাটেনি তখন এই জাতীয় কিছু কোড লিখেছিলাম:
val list:List[Person] = /* get your list */
val (students,teachers) =
list.foldLeft(List.empty[Student],List.empty[Teacher]) {
case ((acc1, acc2), p) => p match {
case s:Student => (s :: acc1, acc2)
case t:Teacher => (acc1, t :: acc2)
}
}
আমি জানি আমি পার্টির জন্য দেরি করে থাকতে পারি এবং আরও নির্দিষ্ট উত্তর থাকতে পারে তবে আপনি এর সদ্ব্যবহার করতে পারেন groupBy
val ret = List(1,2,3,4).groupBy(x => x % 2 == 0)
ret: scala.collection.immutable.Map[Boolean,List[Int]] = Map(false -> List(1, 3), true -> List(2, 4))
ret(true)
res3: List[Int] = List(2, 4)
ret(false)
res4: List[Int] = List(1, 3)
আপনি যদি শর্তটি অ-বুলিয়ান কিছুতে পরিবর্তন করতে চান তবে এটি আপনার কোডটিকে কিছুটা ভবিষ্যত-প্রমাণ করে তোলে।
আপনি যদি কোনও তালিকাকে 2 টিরও বেশি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করতে চান, আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন (ints অনুসন্ধান করার প্রয়োজন হলে পরিবর্তন করুন)
def split(list_in: List[String], search: String): List[List[String]] = {
def split_helper(accum: List[List[String]], list_in2: List[String], search: String): List[List[String]] = {
val (h1, h2) = list_in2.span({x: String => x!= search})
val new_accum = accum :+ h1
if (h2.contains(search)) {
return split_helper(new_accum, h2.drop(1), search)
}
else {
return accum
}
}
return split_helper(List(), list_in, search)
}
// TEST
// split(List("a", "b", "c", "d", "c", "a"), {x: String => x != "x"})
val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)partitionএকটি পাঠযোগ্য উপায়ে ফলাফল tuple ধ্বংস করার উপায়।