मेरी व्यक्तिगत पसंदीदा विधि टुपल्स के लिए प्रदान किए गए निहित आदेश का उपयोग करना है, क्योंकि यह स्पष्ट, संक्षिप्त और सही है:
case class A(tag: String, load: Int) extends Ordered[A] {
// Required as of Scala 2.11 for reasons unknown - the companion to Ordered
// should already be in implicit scope
import scala.math.Ordered.orderingToOrdered
def compare(that: A): Int = (this.tag, this.load) compare (that.tag, that.load)
}
यह काम करता है क्योंकि साथीOrdered एक अंतर्निहित रूपांतरण को परिभाषित करता Ordering[T]है Ordered[T]जिसमें से किसी भी वर्ग के कार्यान्वयन के लिए गुंजाइश है Ordered। Orderingएस के लिए निहित एस का अस्तित्व Tupleएक रूपांतरण प्रदान TupleN[...]करने में सक्षम बनाता है Ordered[TupleN[...]]बशर्ते कि टपल के Ordering[TN]सभी तत्वों T1, ..., TNके लिए एक निहित मौजूद है , जो हमेशा होना चाहिए क्योंकि यह बिना किसी डेटा प्रकार के सॉर्ट करने के लिए कोई मतलब नहीं है Ordering।
टुपल्स के लिए निहित आदेश आपके सॉर्ट करने के लिए किसी भी प्रकार के परिदृश्य के लिए एक समग्र सॉर्ट कुंजी है:
as.sortBy(a => (a.tag, a.load))
जैसा कि यह जवाब लोकप्रिय साबित हुआ है कि मैं इस पर विस्तार करना चाहूंगा, यह देखते हुए कि कुछ परिस्थितियों में निम्नलिखित के जैसा एक समाधान उद्यम-ग्रेड ™ माना जा सकता है:
case class Employee(id: Int, firstName: String, lastName: String)
object Employee {
// Note that because `Ordering[A]` is not contravariant, the declaration
// must be type-parametrized in the event that you want the implicit
// ordering to apply to subclasses of `Employee`.
implicit def orderingByName[A <: Employee]: Ordering[A] =
Ordering.by(e => (e.lastName, e.firstName))
val orderingById: Ordering[Employee] = Ordering.by(e => e.id)
}
दिया es: SeqLike[Employee], es.sorted()नाम से छाँटेगा, और es.sorted(Employee.orderingById)आईडी से छाँटेगा। इसके कुछ लाभ हैं:
- छांटे दृश्य स्थान कलाकृतियों के रूप में एक ही स्थान में परिभाषित कर रहे हैं। यह उपयोगी है यदि आपके पास कई क्षेत्रों पर जटिल प्रकार हैं।
- स्केला लाइब्रेरी में कार्यान्वित अधिकांश छँटाई कार्यक्षमता इंस्टेंसेस के उपयोग से संचालित होती है
Ordering, इसलिए सीधे ऑर्डर देने से अधिकांश मामलों में निहित रूपांतरण समाप्त हो जाता है।