मेरी व्यक्तिगत पसंदीदा विधि टुपल्स के लिए प्रदान किए गए निहित आदेश का उपयोग करना है, क्योंकि यह स्पष्ट, संक्षिप्त और सही है:
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
, इसलिए सीधे ऑर्डर देने से अधिकांश मामलों में निहित रूपांतरण समाप्त हो जाता है।