2011-02-10 9 views
9

कहें कि मेरे पास स्ट्रिंग्स का एक सेट है जिसे मैं लंबाई से ऑर्डर करना चाहता हूं लेकिन सामान्य String विशिष्टता से अद्वितीय हूं। मेरा मतलब यह है कि मैं Set में एक ही लंबाई की एक से अधिक स्ट्रिंग कर सकता था, लेकिन उन्हें लंबाई से क्रमबद्ध किया जाना चाहिए।स्कैला सॉर्टेडसेट - एक आदेश द्वारा क्रमबद्ध और कुछ और अद्वितीय?

val orderByLength = Ordering[Int].on[String](_ length) 

जो मुझे लगता है कि वास्तव में अच्छा लग रहा है:

मैं इस तरह के आदेश व्यक्त करना चाहता हूँ। लेकिन अगर मैं इसे सॉर्टेडसेट में फेंकना चाहता हूं, तो इस तरह कहें:

scala> val s = SortedSet("foo", "bar")(orderByLength) 
s: scala.collection.immutable.SortedSet[java.lang.String] = TreeSet(bar) 

मुझे केवल 'बार' मिलता है। ऐसा इसलिए है क्योंकि Ordering कुल ऑर्डरिंग का प्रतिनिधित्व करता है और इसलिए compare 0 देता है तत्वों को समान माना जाता है।

इसलिए मुझे लगता है कि मुझे जंजीर क्रम बनाने और स्ट्रिंग्स की तुलना करने की आवश्यकता है यदि लंबाई बराबर होती है। ऐसा करने के लिए मैं इस तरह "मेरी लाइब्रेरी दलाल" -pattern प्रयोग किया है:

trait ChainableOrderings { 
    class ChainableOrdering[T](val outer: Ordering[T]) { 
    def ifEqual(next: Ordering[T]): Ordering[T] = new Ordering[T] { 
     def compare(t1: T, t2: T) = { 
     val first = outer.compare(t1, t2) 
     if (first != 0) first else next.compare(t1, t2) 
     } 
    } 
    } 
    implicit def chainOrdering[T](o: Ordering[T]) = new ChainableOrdering[T](o) 
} 

मैं उपयोग कर सकते हैं कि जैसे:

val ordering = Ordering[Int].on[String](_ length) ifEqual Ordering[String] 

मैंने सोचा कि यह वास्तव में महान देखा, लेकिन फिर मुझे एहसास हुआ कि मैं क्या करना चाहता था कि स्ट्रिंग्स के प्राकृतिक क्रम से वास्तव में आदेश देना न पड़े, मैं बस आकार के अनुसार आदेश देना चाहता था, लेकिन किसी और चीज से विशिष्टता। क्या यह एक और अधिक सुरुचिपूर्ण तरीके से संभव है?

val orderByLength = Ordering[(Int, String)].on[String](s => s.length -> s) 

दूसरे शब्दों में, एक टपल का प्रयोग कर एक टाई ब्रेकर पाने के लिए:

उत्तर

18

क्या मैं ऐसी स्थितियों में ऐसा करते हैं है।

दूसरी तरफ, मुझे लगता है कि यह SortedSet की मूर्खतापूर्ण है, ताकि पर पर आधारित तत्वों पर विचार किया जा सके। मुझे लगता है कि इससे पहले चर्चा की गई है, लेकिन मैं मेलिंग सूचियों के अभिलेखागार और स्कैला ट्रैक को इस पर चर्चा/टिकट के लिए खोजने की संभावना को त्याग नहीं सकता, और शायद अपने व्यवहार को बदलने के लिए SortedSet प्राप्त करने का प्रयास कर रहा हूं।

+4

एक सेट में केवल विशिष्ट वस्तुएं होती हैं। एक क्रमबद्ध सेट में कुल ऑर्डरिंग है। विशेष रूप से, 'एस में एक' होता है और 'एस में बी' का अर्थ है या तो 'a

+0

उत्कृष्ट! यह मेरे संस्करण की तुलना में काफी अधिक संक्षिप्त है। –

+0

@rex शायद यह एक पूर्व निर्धारित सेट (http://en.wikipedia.org/wiki/Preorder) के साथ उपयोगी होगा। प्रकार के प्राकृतिक क्रम/समानता के लिए 'हैशसेट्स' के पत्ते के साथ उपलब्ध 'ऑर्डरिंग' के लिए एक रेडब्लैक पेड़ कहें। कम से कम मेरा अंतर्ज्ञान यह था कि प्रदान की गई 'ऑर्डरिंग' का उपयोग केवल क्रमबद्ध करने के लिए किया जाएगा और समानता की तलाश न करने के लिए, मुझे नहीं पता कि क्यों। –

संबंधित मुद्दे