2012-05-24 24 views
17

मैं पिछले आइटम से पहले आइटम से LinkedHashSet की वस्तुओं के माध्यम से कैसे पुन: प्रयास कर सकता हूं?जावा लिंक्ड हैशसेट पीछे की ओर इशारा

+0

जावा संग्रह फ्रेमवर्क में क्यों शामिल नहीं है। लिंक्ड हैशसेट एफआईएफओ ऑर्डर को बनाए रखता है ताकि ऑर्डर को एलआईएफओ में बदलने के लिए एक यूटिलिटी होनी चाहिए जो कि अलग-अलग लगता है जब एक ही समय में सम्मिलन आदेश को बनाए रखना आवश्यक है, हमें रिवर्स ऑर्डर में पुनरावृत्ति करने की आवश्यकता हो सकती है। मेरी परियोजना में कुछ समय पहले मुझे इसकी आवश्यकता थी। दुर्भाग्यवश, मुझे Collections.reverse() उपयोगिता का लाभ उठाने के लिए मध्यस्थ के रूप में सूची का उपयोग करना होगा। यह गंदा है यह नहीं है! – Bhavesh

उत्तर

19

आप संग्रह का उपयोग जारी रखना चाहते हैं, तो आप निम्न का उपयोग कर सकते:

तो आप बस कर सकते हैं आप के बजाय एक सरणी का उपयोग कर के साथ ठीक कर रहे हैं

LinkedHashSet<T> set = ... 

LinkedList<T> list = new LinkedList<>(set); 
Iterator<T> itr = list.descendingIterator(); 
while(itr.hasNext()) { 
    T item = itr.next(); 
    // do something 
} 

, आप hvgotcodes' answer पर एक नज़र डालें।

LinkedHashSet<T> set = ... 

List<T> list = new ArrayList<>(set); 
Collections.reverse(list); 

for(T item : list){ 
    ... 
} 
+0

'नया लिंक्डलिस्ट <> (सेट)' सभी वस्तुओं की प्रतिलिपि बनायेगा, है ना? – Sasha

+0

@ साशा हां, यह होगा। – Jeffrey

7

एर, यह मानते हुए आप LinkedHashSet मतलब ...

मैं toArray का प्रयोग करेंगे और सिर्फ पाश के लिए एक रिवर्स का उपयोग करें।

ऐसा करने का एक बेहतर तरीका हो सकता है, लेकिन यह काम करना चाहिए। toArray की गारंटी देता है किसी भी क्रम संरक्षित है

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

तरह

Set<MyType> mySet = new LinkedHashSet(); 
... 
MyType[] asArray = mySet.toArray(); 

for (int i = asArray.length - 1; i>=0; i--){ 
.. 
} 
+0

यह काम करता है लेकिन काफी अक्षम है क्योंकि यह सेट की प्रतिलिपि बनाता है ... – fig

-7

जावाडोक से: "यह लिंक्ड सूची यात्रा आदेश है, जो जिस क्रम में तत्वों सेट (प्रविष्टि-आदेश) में डाला गया है परिभाषित करता है।"

LinkedHashSet<Integer> numbers = new LinkedHashSet<Integer>(); 
numbers.add(1); 
numbers.add(2); 
numbers.add(33); 
numbers.add(44); 
numbers.add(108); 

for (Integer i : numbers) { 
    System.out.println(i); 
} 
+1

"अंतिम से पहले तक।" – hvgotcodes

5

यह एक और तरीका है।

ListIterator<T> l = new ArrayList<T>(yourLinkedHashList).listIterator(); 
// ListIterator can iterate in reverse 
while(l.hasPrevious()) { 
    T obj = l.previous(); 
} 
2

तुम सच में LinkedHashSet मतलब हैं, तो आप एक ArrayList में तत्वों रखा और फिर ArrayList के ListIterator इस्तेमाल कर सकते हैं:

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