2009-03-22 20 views
7

मैं अपने कार्यक्रम के किसी अन्य भाग में उपयोग के लिए जावा की प्राथमिकता क्यूई कक्षा को क्लोजर में लपेटना चाहता हूं। जो मैं समझने की कोशिश कर रहा हूं वह यह है कि अगर यह एक अजीब तरीके से ऐसा करने का कोई तरीका है और प्राथमिकता कतार अपरिवर्तनीय बनाते हैं। क्या ऐसा करने के कोई अच्छे तरीके हैं, या क्या मैं प्राथमिकता क्यूयू को एक परिवर्तनीय डेटा संरचना के रूप में उपयोग करने के लिए बेहतर होने जा रहा हूं?क्लोजर में जावा क्लास अपरिवर्तनीय कैसे बना सकता हूं?

उत्तर

8

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

यदि आप वास्तव में एक लगातार प्राथमिकता कतार this thread दिलचस्प हो सकते हैं। ऐसा लगता है कि हालांकि रैखिक-समय सम्मिलित हैं, इसलिए यदि यह एक मुद्दा है तो आपको एक और कार्यान्वयन की तलाश करनी होगी।

संपादित करें: दूसरे विचार पर, एक सतत प्राथमिकता कतार का एक सरल कार्यान्वयन सिर्फ एक क्रमबद्ध सेट में (prio, value) -pairs को स्टोर करना है। कुछ इस तरह:

(defn make-pqueue [] 
    (sorted-set)) 

(defn pqueue-add [pq x prio] 
    (conj pq [prio x])) 

(defn pqueue-peek [pq] 
    (first pq)) 

(defn pqueue-pop [pq] 
    (let [top (first pq)] 
    (disj pq top))) 
बेशक

, ऊपर कोड सुंदर (, कोई कई प्रविष्टियाँ उदाहरण के लिए) सीमित है, लेकिन यह विचार को दिखाता है।

+0

सॉर्ट किए गए सेट को prio (prio, value) जोड़ी में prio द्वारा सॉर्ट करने के लिए कैसे पता चलता है? –

+0

क्लोजर वैक्टरों की तुलनात्मक रूप से वैक्टरों की तुलना करता है, इसलिए यह प्राथमिकता से पहले क्रमबद्ध होगा, और दूसरा मूल्य से। – CAdaker

+0

दरअसल, स्रोत को देखते हुए, बराबर लंबाई के केवल वैक्टरों की तुलना लेक्सिकोोग्राफिक रूप से की जाती है। लेकिन इस मामले में यह कोई समस्या नहीं है। – CAdaker

7

आप स्वचालित रूप से उत्परिवर्तनीय वर्ग को अपरिवर्तनीय नहीं बना सकते हैं। कोई हमेशा जावा क्लास को सीधे कॉल कर सकता है और इसे बदल सकता है।

अपरिवर्तनीयता को मजबूर करने के लिए आप या तो इसे क्लोजर में लागू कर सकते हैं, या जावा वर्ग का विस्तार कर सकते हैं और सभी परिवर्तनीय विधि कार्यान्वयन में अपवाद फेंक सकते हैं।

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

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