স্কেলে বিপরীত সাজানোর সর্বোত্তম উপায় কী?


137

স্কেলে বিপরীত সাজানোর সর্বোত্তম উপায় কী? আমি ধারণা করি যে নিম্নলিখিতটি কিছুটা ধীর।

list.sortBy(_.size).reverse

বাছাইয়ের মাধ্যমে বিপরীত বাছাইয়ের সুবিধাজনক উপায় আছে কি? আমি বরং ব্যবহার করার প্রয়োজন হবে না sortWith


1
নীচের সমাধানগুলি সবই খুব সুন্দর তবে আমি পড়ার জন্য আপনার সহজ উপায়টিটি খুঁজে পেয়েছি। আমি যাচাই করেছি যে আপনার সন্দেহ হিসাবে লেখার এই পদ্ধতিতে একটি গণনার ঘাটতি রয়েছে। আমি যে পরীক্ষাটি করেছিলাম তা হ'ল: ভাল ক্লক = নতুন টাইমার (1 থেকে 1e6.toInt) orted ঘড়ি.এডিএলএল্যাপ ("ভুল উপায়ে") প্রিন্টলান (ক্লক.টোস্ট্রিং) [সঠিক উপায়, ল্যাপ = 76, দুর। = 76] | [ভুল উপায়ে, ল্যাপ = 326, দুর। = 250]
খোয়া

উত্তর:


241

আপনি কিছু সংখ্যার মান অনুসারে বাছাই করলে সাইন পরিবর্তন করার সুস্পষ্ট উপায় থাকতে পারে

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)

তবে এটি অনেক কম আনন্দদায়ক।


অতি সহায়ক - আমি নির্বোধ প্রশ্ন জিজ্ঞাসা করছি কিনা তা নিশ্চিত ছিলাম না, তবে আমি আপনার উত্তর থেকে অনেক কিছু শিখেছি!
schmmd

ব্যতীত এটি কাজ করে না। যখন আমার কাছে আরইপিএল হাতে নেই তখন কখনই উত্তর দেওয়া উচিত নয়। আপডেট দেখুন।
দিদিয়ের ডুপন্ট

এবং একটি গৌণ ক্ষেত্রের উপর বাছাই করতে, একটি টিপল ফিরিয়ে দিন:list.sortBy(x => (-x.size, x.forTiesUseThisField))
ব্রেন্ট ফাউস্ট

2
পরিবর্তে এটি আমার স্পষ্টতাত্ত্বিক বিষয়টির জন্য আরও পরিষ্কার (তবে দীর্ঘ) list.sorted(Ordering.by((_: TheType).size).reverse)বিবেচনা করুন list.sorted(Ordering.by[TheType, Int](_.size).reverse)
চেরি

5
আমি ব্যক্তিগতভাবেও পছন্দ করি list.sortBy(_.size)(Ordering[Int].reverse)
dtech


27

সম্ভবত এটি আরও কিছুটা ছোট করা:

def Desc[T : Ordering] = implicitly[Ordering[T]].reverse

List("1","22","4444","333").sortBy( _.size )(Desc)

19

সহজ প্যাসি (কমপক্ষে ক্ষেত্রে 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)

9

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)

9

উভয় 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বুঝতে সহজ সঙ্গে একটি খুঁজে ।



1

আপনি যখন কোনও ফাংশনটি পাস করেন সে ক্ষেত্রে আর একটি সম্ভাবনা যা আপনি সরাসরি অ্যারেবুফারের সাথে বাছাই করতে পারবেন না বাছাইয়ের মাধ্যমে উদাহরণস্বরূপ:

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

0

এটি আমার কোড;)

val wordCounts = logData.flatMap(line => line.split(" "))
                        .map(word => (word, 1))
                        .reduceByKey((a, b) => a + b)

wordCounts.sortBy(- _._2).collect()

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