স্কেলে বিপরীত সাজানোর সর্বোত্তম উপায় কী? আমি ধারণা করি যে নিম্নলিখিতটি কিছুটা ধীর।
list.sortBy(_.size).reverse
বাছাইয়ের মাধ্যমে বিপরীত বাছাইয়ের সুবিধাজনক উপায় আছে কি? আমি বরং ব্যবহার করার প্রয়োজন হবে না sortWith
।
স্কেলে বিপরীত সাজানোর সর্বোত্তম উপায় কী? আমি ধারণা করি যে নিম্নলিখিতটি কিছুটা ধীর।
list.sortBy(_.size).reverse
বাছাইয়ের মাধ্যমে বিপরীত বাছাইয়ের সুবিধাজনক উপায় আছে কি? আমি বরং ব্যবহার করার প্রয়োজন হবে না sortWith
।
উত্তর:
আপনি কিছু সংখ্যার মান অনুসারে বাছাই করলে সাইন পরিবর্তন করার সুস্পষ্ট উপায় থাকতে পারে
list.sortBy(- _.size)
আরও সাধারণভাবে, বাছাইয়ের পদ্ধতিটি কোনও অন্তর্নিহিত অর্ডার দিয়ে বাছাই করা যেতে পারে যা আপনি স্পষ্ট করে বলতে পারেন এবং অর্ডারিংয়ের বিপরীত রয়েছে (নীচের তালিকার বিপরীতে নয়) আপনি করতে পারেন
list.sorted(theOrdering.reverse)
আপনি যে ক্রমটিকে বিপরীত করতে চান সেটি হ'ল অন্তর্নিহিত অর্ডারিং, আপনি এটিকে স্পষ্টভাবে [অর্ডারিং [এ]] (আপনি যে ধরণের আদেশ দিচ্ছেন) বা আরও ভাল অর্ডারিং [এ] দিয়ে পেতে পারেন। হবে
list.sorted(Ordering[TheType].reverse)
সাজ্টবাই অর্ডারিং.বি ব্যবহার করার মতো, যাতে আপনি এটি করতে পারেন
list.sorted(Ordering.by(_.size).reverse)
লেখার জন্য সংক্ষিপ্ততম নয় (বিয়োগের তুলনায়) তবে অভিপ্রায়টি পরিষ্কার
হালনাগাদ
শেষ লাইন কাজ করে না। স্বীকার করতে _
এ Ordering.by(_.size)
, কম্পাইলার প্রয়োজনের উপর কোন ধরনের আমরা ক্রম হয় জানতে, এটি টাইপ যাতে _
। মনে হতে পারে যে তালিকার উপাদানটির ধরণ হবে তবে সাজানোর স্বাক্ষর হিসাবে এটি এমনটি নয়
def sorted[B >: A](ordering: Ordering[B])
। অর্ডারিং চালু থাকতে পারে A
তবে কোনও পূর্বপুরুষের উপর A
(আপনি ব্যবহার করতে পারেন byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
)। এবং প্রকৃতপক্ষে, তালিকাগুলি সমবায় এই ঘটনাটি এই স্বাক্ষরকে বাধ্য করে। এক করতে পারেন
list.sorted(Ordering.by((_: TheType).size).reverse)
তবে এটি অনেক কম আনন্দদায়ক।
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
বিবেচনা করুন list.sorted(Ordering.by[TheType, Int](_.size).reverse)
।
list.sortBy(_.size)(Ordering[Int].reverse)
।
সম্ভবত এটি আরও কিছুটা ছোট করা:
def Desc[T : Ordering] = implicitly[Ordering[T]].reverse
List("1","22","4444","333").sortBy( _.size )(Desc)
সহজ প্যাসি (কমপক্ষে ক্ষেত্রে size
):
scala> val list = List("abc","a","abcde")
list: List[java.lang.String] = List(abc, a, abcde)
scala> list.sortBy(-_.size)
res0: List[java.lang.String] = List(abcde, abc, a)
scala> list.sortBy(_.size)
res1: List[java.lang.String] = List(a, abc, abcde)
sortBy
অন্তর্নিহিত পরামিতি ord
যা ক্রম সরবরাহ করে
def sortBy [B] (f: (A) ⇒ B)(implicit ord: Ordering[B]): List[A]
সুতরাং, আমরা নিজের Ordering
অবজেক্টকে সংজ্ঞায়িত করতে পারি
scala> implicit object Comp extends Ordering[Int] {
| override def compare (x: Int, y: Int): Int = y - x
| }
defined module Comp
List(3,2,5,1,6).sortBy(x => x)
res5: List[Int] = List(6, 5, 3, 2, 1)
উভয় sortWith
এবং sortBy
একটি কমপ্যাক্ট বাক্য গঠন:
case class Foo(time:Long, str:String)
val l = List(Foo(1, "hi"), Foo(2, "a"), Foo(3, "X"))
l.sortWith(_.time > _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi))
l.sortBy(- _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi))
l.sortBy(_.time) // List(Foo(1,hi), Foo(2,a), Foo(3,X))
আমি sortWith
বুঝতে সহজ সঙ্গে একটি খুঁজে ।
val list = List(2, 5, 3, 1)
list.sortWith(_>_) -> res14: List[Int] = List(5, 3, 2, 1)
list.sortWith(_<_) -> res14: List[Int] = List(1, 2, 3, 5)
আপনি যখন কোনও ফাংশনটি পাস করেন সে ক্ষেত্রে আর একটি সম্ভাবনা যা আপনি সরাসরি অ্যারেবুফারের সাথে বাছাই করতে পারবেন না বাছাইয়ের মাধ্যমে উদাহরণস্বরূপ:
val buf = collection.mutable.ArrayBuffer[Int]()
buf += 3
buf += 9
buf += 1
// the sort function (may be passed through from elsewhere)
def sortFn = (A:Int, B:Int) => { A < B }
// the two ways to sort below
buf.sortWith(sortFn) // 1, 3, 9
buf.sortWith((A,B) => { ! sortFn(A,B) }) // 9, 3, 1
এটি আমার কোড;)
val wordCounts = logData.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey((a, b) => a + b)
wordCounts.sortBy(- _._2).collect()