কীভাবে অনুক্রমের দ্বারা একটি ক্রম দুটি টুকরা বিভক্ত?


120

আমি কীভাবে একটি অনুক্রমের দ্বারা ক্রম দুটি তালিকায় বিভক্ত করব?

বিকল্প: আমি নিজের পদ্ধতি ব্যবহার করতে filterএবং filterNotলিখতে পারি, তবে এর চেয়ে ভাল আরও সাধারণ (অন্তর্নির্মিত) কোনও পদ্ধতি নেই?

উত্তর:


193

partitionপদ্ধতি ব্যবহার করে :

scala> List(1,2,3,4).partition(x => x % 2 == 0)
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3))

1
val (even, odd) = List(1,2,3,4).partition(x => x % 2 == 0)partitionএকটি পাঠযোগ্য উপায়ে ফলাফল tuple ধ্বংস করার উপায়।
k0pernikus

2
পার্টিশনের ভিতরে ফাংশনটি সংক্ষিপ্ত করতে পারেন _ % 2 == 0
k0pernikus

138

ভালো partitionজিনিস আপনি চেয়েছিলেন ছিল - সেখানে অন্য পদ্ধতি যে দুই একটি তালিকা বিভক্ত করার জন্য একটি বিধেয় ব্যবহার আছে: span

প্রথমটি, পার্টিশনটি সমস্ত "সত্য" উপাদানকে একটি তালিকায় রাখবে এবং অন্যগুলি দ্বিতীয় তালিকায় রাখবে।

স্প্যান সমস্ত উপাদানকে একটি তালিকায় রাখবে যতক্ষণ না কোনও উপাদান "মিথ্যা" না হয় (ভবিষ্যদ্বাণী অনুসারে)। সেই বিন্দু থেকে এগিয়ে এটি উপাদানগুলিকে দ্বিতীয় তালিকায় রাখবে।

scala> Seq(1,2,3,4).span(x => x % 2 == 0)
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4))

2
ঠিক আমি খুঁজছেন ছিল কি. যখন তালিকাটি সম্পর্কিত মানদণ্ডের দ্বারা আদেশ করা হয় তখন এটি অনেক বেশি অর্থবোধ করে।
erich2k8

16

আপনি স্কেলএক্স.আরএটি একবার দেখতে চান - এটি আপনাকে তাদের স্বাক্ষরের দ্বারা ফাংশনগুলির জন্য স্কালার স্ট্যান্ডার্ড লাইব্রেরি অনুসন্ধান করতে দেয়। উদাহরণস্বরূপ, নিম্নলিখিত টাইপ করুন:

List[A] => (A => Boolean) => (List[A], List[A])

আপনি বিভাজন দেখতে পাবেন ।


10
স্কেলএক্স.আর ডোমেন বর্তমানে মারা গেছে। তবে বিকল্প আছে - scala-search.org ;-)।
monnef

1
কীভাবে মাছ ধরতে শেখাচ্ছেন!
এই ব্যবহারকারী 21

1
@ মোনেফ 2020 এর জন্য আপনার বিকল্পের কোনও বিকল্প? :)
তেহসিভিলিয়ান

14

আপনার যদি কিছু অতিরিক্ত অতিরিক্ত প্রয়োজন হয় তবে আপনি ফোল্ডফেল্টও ব্যবহার করতে পারেন। আমি যখন এই বিভাগটি কাটেনি তখন এই জাতীয় কিছু কোড লিখেছিলাম:

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)
    }
  }

1
টিউপল এবং ফোল্ডলফিট ব্যবহার করার খুব সুন্দর উপায়। দুটি তালিকাকে একই ক্রমে দক্ষতার সাথে রাখার জন্য আমি একটি লিস্টবফার ব্যবহার করে শেষ করেছি তবে অন্যথায় এটি আমার যা প্রয়োজন তা ছিল তা স্পষ্ট করে।
ম্যাট হ্যাগোপিয়ান

1

আমি জানি আমি পার্টির জন্য দেরি করে থাকতে পারি এবং আরও নির্দিষ্ট উত্তর থাকতে পারে তবে আপনি এর সদ্ব্যবহার করতে পারেন 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)

আপনি যদি শর্তটি অ-বুলিয়ান কিছুতে পরিবর্তন করতে চান তবে এটি আপনার কোডটিকে কিছুটা ভবিষ্যত-প্রমাণ করে তোলে।


0

আপনি যদি কোনও তালিকাকে 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"})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.