2012-12-03 15 views
27

मुझे यह जानने की जरूरत है कि LinkedList iterator को अपने पहले तत्व में "रीसेट" कैसे करें।जावा- रीसेट सूची इटरेटर सूची के पहले तत्व में

उदाहरण के लिए:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

से अधिक बार बार और इटरेटर के कई चालें मैं स्थिति "रीसेट" करने की जरूरत है के बाद इटरेटर का `

मैं पूछने के लिए मैं कैसे पहला तत्व

मुझे पता है कि मैं इस तरह से पहले तत्व की सूची इटरेटर प्राप्त कर सकते हैं करने के लिए" रीसेट "मेरे इटरेटर कर सकते हैं:

iter= list.listIterator(1);

क्या यह सबसे अच्छा समाधान है? या शायद मुझे ओरेकल दस्तावेज़ों में कुछ याद आया?

+0

क्यों नया इटरेटर नहीं बनाते? – reprogrammer

+1

अच्छी तरह से आप कुछ याद कर चुके हैं, अगर आपको अगले और शायद पिछले से अधिक करने की आवश्यकता है, तो इटरेटर सबसे अच्छा विकल्प नहीं है। आपको रीसेट करने की आवश्यकता क्यों है? –

+0

मैं जावा में गतिशील सूची के विचार को समझने की कोशिश कर रहा हूं। कुछ हफ्ते पहले मुझे जेएसपी ओज पर सत्र चर के साथ समस्या है। ईएल और टैगलिब्स से मैं इटरेटर की एक विधि का उपयोग कर सकता हूं लेकिन मैं इसे फिर से परिभाषित नहीं कर सकता (मुझे अभी भी जेएसपी के बारे में खराब ज्ञान है लेकिन मैं अभी भी इसे सुधार रहा हूं :)) जब आप लिखते हैं कि "इटरेटर सबसे अच्छा विकल्प नहीं है" तो आपको क्या लगता है? क्या आप इसे मुझे समझा सकते हैं? :) – ognistysztorm

उत्तर

16

बेस्ट होगा बिल्कुल LinkedList का उपयोग नहीं किया है, आमतौर पर यह सभी विषयों में धीमी, और कम से उपयोगी है। (जब मुख्य रूप से डालने/सामने से हटाया जा रहा है, खासकर के लिए बड़ा सरणियों LinkedList तेजी से होता है)

उपयोग ArrayList, और साथ

int len = list.size(); 
for (int i = 0; i < len; i++) { 
    Element ele = list.get(i); 
} 

रीसेट पुनरावृति तुच्छ, बस पाश फिर से है।

iter = list.listIterator(); 

(मैं अपने जीवन LinkedList का एक फायदा में केवल एक बार देखा था:
आप पुनरावर्तक के प्रयोग पर जोर देते हैं, तो आप एक नया iterator उपयोग करने के लिए मैं कर सकता था थोड़ी देर के पाश whith और हटाने के माध्यम से लूप पहला तत्व)

+4

मुख्य रूप से आगे बढ़ने और डालने के बाद लिंकडलिस्ट तेज है। – raceworm

+0

लिंक्डलिस्ट के मामले में भी मध्य से आइटम को हटाना तेज है। यही है अगर आप iterator.remove() के साथ आइटम्स को पुन: हटा रहे हैं और हटा रहे हैं। ArrayList शेष वस्तुओं की स्थानांतरण की आवश्यकता होगी। – Sohaib

+0

@ सोहाइब, हां मुख्य रूप से यह सूची के आकार पर निर्भर करता है। तत्वों की विशिष्ट संख्या तक System.arraycopy, जो आंतरिक सी का उपयोग करता है - memcopy, जिसे सरणी को स्थानांतरित करने के लिए उपयोग किया जाता है तेज़ है। उन्नत कार्यान्वयन तत्व आकार पर निर्भर अंतर्निहित कार्यान्वयन स्विच। – AlexWien

34

आप सूची की शुरुआत में इटरेटर इशारा का एक उदाहरण प्राप्त करने के लिए फिर से listIterator विधि कॉल कर सकते हैं:

iter = list.listIterator(); 
+3

भयानक। यह तुरंत स्पष्ट नहीं है कि यह कॉल केवल उसी संदर्भ को वापस नहीं करता है जिसे आप पहले ही उपयोग कर रहे हैं। लेकिन मुझे लगता है कि स्रोत की तलाश में उस जवाब को हल कर दिया होगा। यहां किसी के लिए उत्सुकता के लिए एक लिंक है क्योंकि यह एक आदत है जिसके बारे में मैं बेहतर होने की कोशिश कर रहा हूं: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ उपयोग/ArrayList.java # ArrayList.listIterator% 28% 29 – anon58192932

4

क्रम आवश्यक नहीं है, तो हम एक ही इटरेटर के साथ फिर से पुनरावृति कर सकते हैं पिछड़ेhasPrevious() और previous() तरीकों का उपयोग कर:

ListIterator<T> lit = myList.listIterator(); // create just one iterator 

प्रारंभ में इटरेटर शुरुआत में बैठता है, हम करते हैं आगे यात्रा:

while (lit.hasNext()) process(lit.next()); // begin -> end 

फिर iterator अंत में बैठता है, हम कर सकते हैं पिछड़े यात्रा:

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin 
4

यह वह जगह है एक वैकल्पिक समाधान, लेकिन कोई तर्क दे सकता है कि यह इसके लायक बनाने के लिए पर्याप्त मूल्य नहीं जोड़ता है:

import com.google.common.collect.Iterables; 
... 
Iterator<String> iter = Iterables.cycle(list).iterator(); 
if(iter.hasNext()) { 
    str = iter.next(); 
} 

कॉलिंग है अगला() अंत में इटेटरेटर कर्सर को रीसेट कर देगा यदि यह अंत है।

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