2009-04-25 14 views
5

मेरे पास एक कक्षा है जिसे मैं scala.collection.mutable.PriorityQueue में उपयोग करना चाहता हूं, लेकिन मैं इसे केवल एक उद्देश्य के लिए आदेश देना चाहता हूं [ए]। मैं उस आदेश पर विचार नहीं करता जिसे मैं प्राथमिकता क्यूयू के संबंध में कक्षा के प्राकृतिक क्रम के रूप में उपयोग करना चाहता हूं।स्कैला: क्या जावा में प्राथमिकता क्यूई का उपयोग करने का कोई तरीका है?

class MyObject (sequence: Int, values: List[String]) ... 

तो, मेरी PriorityQueue में, मैं चाहूँगा मूल्यों 'अनुक्रम' द्वारा आदेश दिया जा सकता है। हालांकि, सिर्फ इसलिए कि दो ऑब्जेक्ट्स में एक ही अनुक्रम होता है, जिससे उन्हें स्वाभाविक रूप से बराबर नहीं बनाया जाता है क्योंकि उनके 'मूल्यों' की सामग्री अलग हो सकती है।

यह जहां, जावा में, यह PriorityQueue के लिए एक वैकल्पिक तुलनाकारी वस्तु आपूर्ति करने में सक्षम होने के लिए अच्छा है है। मेरा तुलनाकर्ता वस्तुओं को उनके 'अनुक्रम' के संबंध में आदेश देगा और उनके 'मूल्यों' को अनदेखा करेगा।

PriorityQueue वर्ग एक साथ parameterized किया जाना चाहिए "एक <% आदेश दिया [एक]"

class PriorityQueue[A <% Ordered[A]] extends ... 

मैं क्या पढ़ा है से, इसका मतलब यह है मेरी कक्षा आदेश दिया विस्तार करना होगा [एक] या मैं एक प्रदान करनी चाहिए ऑर्डर करने के लिए "अंतर्निहित डीफ" प्रकार रूपांतरण [ए], जो ईमानदारी से, सुरुचिपूर्ण लगता है।

जावा समाधान लगता है और अधिक "कार्यात्मक" मुझे मुझे एक वर्ग पदानुक्रम में मजबूर कर या मेरी कक्षा monkeypatching के बजाय एक तुलनाकारी समारोह जैसी वस्तु पारित करने के लिए अनुमति देता है।

मुझे एहसास है कि PrioirityQueue का उपयोग करने के विकल्प हैं, लेकिन मुझे लगता है कि मैं यहां स्कैला सीखने की वक्र के खिलाफ उछाल रहा हूं और इस डिजाइन निर्णय को पूरी तरह से खोजे बिना छोड़ना नहीं चाहता हूं।

स्काला पुस्तकालय में यह सिर्फ एक दुर्भाग्यपूर्ण निर्णय है या मैं परंपरा है कि PriorityQueue अधिक उपयोगी और 'कार्यात्मक' बनाता है बुला किसी प्रकार का गलत समझ रहा हूँ?

धन्यवाद

उत्तर

9

वाक्य रचना

class PriorityQueue[A <% Ordered[A]] ... 

वास्तव में सिर्फ

class PriorityQueue[A]()(implicit convert: A => Ordered[A]) ... 

के शीर्ष पर एक प्रकाश sugaring है इसका मतलब है आप अपनी खुद की विधि एक लिख सकते हैं => आदेश दिया [एक]

case class Foo(n: Int) 
def orderedFoo(f: Foo): Ordered[Foo] = new Ordered[Foo] { 
    def compare(other: Foo) = f.n.compare(other.n) 
} 

और मैन्युअल रूप से इसे अपने प्राथमिकता क्यू कन्स्ट्रक्टर

012 में पास करें
new PriorityQueue[Foo]()(orderedFoo) 
3

आदेश दिया [एक] जावा तुलनित्र की भूमिका निभा सकते हैं करने के लिए एक के रूपांतरण समारोह। फ़ंक्शन को केवल उस क्षेत्र में दिखाई देने की आवश्यकता है जहां आप प्राथमिकता Queue बनाते हैं, इसलिए यह आपके ऑब्जेक्ट के लिए "प्राकृतिक ऑर्डरिंग" नहीं बनने वाला है।

2

compilable कोड में इस एक से पहले दोनों (सही) जवाब का मेल:

object o { 
    case class Foo(n: Int) 
    implicit def orderedFoo(f: Foo): Ordered[Foo] = new Ordered[Foo] { 
    def compare(other: Foo) = f.n.compare(other.n) 
    } 

    val x = new scala.collection.mutable.PriorityQueue[Foo]() 
} 

उसका उदाहरण आप के लिए संकलन नहीं होगा क्योंकि (मैं मान रहा हूँ) आप इसे संकलक के रूप में है पर फेंक दिया। आप स्कैला में शीर्ष स्तर के तरीकों को संकलित नहीं कर सकते हैं, सबकुछ किसी ऑब्जेक्ट में होना चाहिए।

2

स्कैला 2.8 में।0, PriorityQueue

class PriorityQueue[A](implicit ord : Ordering[A]) 

में परिवर्तन और आदेश [एक] स्काला में जावा

में तुलनाकारी के समान है
संबंधित मुद्दे

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