2013-07-02 10 views
14

एक ऐरेलिस्ट पर एक कतार का उपयोग करने के लिए एक मूल तर्क यह है कि क्यूई फीफो व्यवहार की गारंटी देता है।सरणीसूची पर कतार का उपयोग कब करें

लेकिन अगर मैं एक ArrayList में 10 तत्व जोड़ता हूं और फिर 0 वें तत्व से शुरू होने वाले तत्वों पर पुन: सक्रिय करता हूं, तो मैं तत्वों को उसी क्रम में पुनर्प्राप्त कर दूंगा जैसा कि उन्हें जोड़ा गया था। तो अनिवार्य रूप से, यह एक फीफो व्यवहार की गारंटी देता है।

पारंपरिक ऐरेलिस्ट की तुलना में कतार के बारे में इतना खास क्या है?

उत्तर

12

यदि मैंने आपको Queue उदाहरण दिया है तो आपको पता चलेगा कि इसे remove() पर कॉल करके आप एफआईएफओ ऑर्डर में तत्व पुनर्प्राप्त करेंगे। अगर मैंने आपको ArrayList उदाहरण दिया है तो आप ऐसी कोई गारंटी नहीं दे सकते हैं।

एक उदाहरण के रूप में निम्नलिखित कोड डालें:

 ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(5); 
    list.add(4); 
    list.add(3); 
    list.add(2); 
    list.add(1); 


    list.set(4,5); 
    list.set(3,4); 
    list.set(2,3); 
    list.set(1,2); 
    list.set(0,1); 

    System.out.println(list); 

अगर मैं अब थे आप इस सूची देने के लिए है, तो 0 से 4 करने के लिए मेरे बार-बार दोहराना आप फीफो क्रम में तत्वों प्राप्त नहीं होता।

इसके अलावा, मैं कहूंगा कि एक और अंतर अमूर्त है। Queue उदाहरण के साथ आपको इंडेक्स के बारे में चिंता करने की ज़रूरत नहीं है और इससे आपको यह सोचने में आसान बनाता है कि आपको ArrayList की पेशकश करने की आवश्यकता नहीं है।

0

उदाहरण के लिए, Queue विधियों poll() और remove() तत्व पुनर्प्राप्त करता है और इसे कतार से हटा देता है।

Queue इंटरफ़ेस (PriorityQueue) के कुछ कार्यान्वयन तत्वों को प्राथमिकता सेट करने की अनुमति देते हैं और उन्हें प्राथमिकता के लिए धन्यवाद प्राप्त करते हैं। यह उस अंतिम मामले में फीफो व्यवहार से कहीं अधिक है।

12

आप javadoc here देख सकते हैं। मुख्य अंतर List आपको जब भी चाहें किसी भी तत्व को देखने देता है। एक कतार केवल आपको "अगली" एक को देखने देती है।

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

यह ध्यान देने योग्य है कि कुछ सूचियां कतार हैं। उदाहरण के लिए, LinkedList पर देखें।

+0

क़तार में तो इस अर्थ में कतार वास्तव में सीमित है क्या ArrayList पहले से ही हमें दिया है ... यह किसी भी नई सुविधा जोड़ने नहीं है ArrayList से डेटा संरचना को बदलने के लिए कोई रास्ता नहीं है। कतार के साथ आप क्या कर सकते हैं आप सरणीसूची (ए.के.ए. यादृच्छिक पहुंच) के साथ कर सकते हैं ... लेकिन इसके विपरीत – Victor

+3

यह इस बात पर निर्भर करता है कि आप इसे कैसे देखते हैं। यदि आप कोड में किराने की दुकान लाइन को लागू करने की कोशिश कर रहे थे, तो 'ऐरेलिस्ट' परेशान होगा क्योंकि उसके पास अगले ग्राहक को 'क्यूई' के रूप में सुविधाजनक तरीके से प्राप्त करने का कोई तरीका नहीं है। आपको 'if (! List.isEmpty()) list.remove (0); 'करना होगा। मैं बजाय 'queue.poll() ' –

+0

पढ़/लिखना चाहूंगा क्यों Arraylist अगले ग्राहक को आसानी से नहीं मिल सकता है? हम सिर्फ एक पुनरावर्तक को परिभाषित करते हैं और iter.next() – Victor

0

अंतर यह है कि एक कतार के लिए, आपको फीफो ऑर्डर में तत्वों को खींचने की गारंटी है। एक ऐरेलिस्ट के लिए, आपको पता नहीं है कि तत्वों को किस क्रम में जोड़ा गया था। आप इसका उपयोग कैसे करते हैं इसके आधार पर, आप एक ArrayList पर FIFO ऑर्डरिंग को लागू कर सकते हैं। मैं एक कतार के लिए एक रैपर भी डिजाइन कर सकता था जिसने मुझे जो भी तत्व चाहता था उसे खींचने की अनुमति दी।

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

4

एक ऐरेलिस्ट की तुलना में कतार (एफआईएफओ, कोई यादृच्छिक अभिगम) पर लगाई गई सीमाएं, डेटा संरचना को बेहतर अनुकूलित करने की अनुमति देती हैं, बेहतर समेकन होती है, और जब इसे बुलाया जाता है तो एक अधिक उपयुक्त और क्लीनर डिज़ाइन होता है।

अनुकूलन और समेकन के संबंध में, सामान्य परिदृश्य की कल्पना करें जहां एक उपभोक्ता इसे उपभोग करते समय कतार भर रहा है। यदि हमने इसके लिए एक ऐरेलिस्ट का उपयोग किया है, तो निष्पक्ष कार्यान्वयन में पहले तत्व के प्रत्येक निष्कासन से प्रत्येक अन्य तत्व को नीचे जाने के लिए ArrayList पर एक शिफ्ट ऑपरेशन होगा। यह बहुत अक्षम है, खासकर एक समवर्ती कार्यान्वयन में क्योंकि सूची पूरे शिफ्ट ऑपरेशन की अवधि के लिए बंद कर दी जाएगी।

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

0

हाँ!

मैं कतार में मतदान() और peek() विधियों का उपयोग करता था जो मूल्य को वापस लेता है और हटा देता है, क्रमशः मुख्य तत्व की जांच करता है। साथ ही यह विधियां आपको विशेष मूल्य शून्य प्रदान करती हैं यदि ऑपरेशन विफल हो जाता है और नहीं एक अपवाद फेंकता है क्योंकि निकालें() विधि nosuchelement अपवाद फेंक देगा।

रेफरी: docs.oracle.com

0

एक स्थिति है जिसमें यादृच्छिक प्रक्रियाओं एक ArrayList बेतरतीब ढंग से अद्यतन करने पर विचार करें और हम उन्हें फीफो में कार्रवाई करने वाले हैं?

इसमें ऐसा करने के लिए, लेकिन

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