यहाँ चाल "रिवर्स" को परिभाषित कर रही है। कोई जगह में सूची को संशोधित कर सकता है, रिवर्स ऑर्डर में एक कॉपी बना सकता है, या रिवर्स ऑर्डर में एक दृश्य बना सकता है।
सबसे सरल तरीका, सहज रूप से बोलना है Collections.reverse
:
Collections.reverse(myList);
यह विधि सूची में जगह को संशोधित करती है । यही है, Collections.reverse
सूची लेता है और अपने तत्वों को अधिलेखित करता है, पीछे कोई अपरिवर्तित प्रतिलिपि नहीं छोड़ता है। यह कुछ उपयोग मामलों के लिए उपयुक्त है, लेकिन दूसरों के लिए नहीं; इसके अलावा, यह माना जाता है कि सूची संशोधित है। यदि यह स्वीकार्य है, तो हम अच्छे हैं।
यदि नहीं, तो कोई रिवर्स ऑर्डर में कॉपी बना सकता है :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
यह दृष्टिकोण काम करता है, लेकिन सूची में दो बार पुनरावृति की आवश्यकता होती है। कॉपी कंस्ट्रक्टर ( new ArrayList<>(list)
) सूची पर निर्भर करता है, और ऐसा ही करता है Collections.reverse
। हम इस पद्धति को केवल एक बार पुन: व्यवस्थित करने के लिए लिख सकते हैं, यदि हम इतने इच्छुक हों:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
यह अधिक कुशल है, लेकिन अधिक क्रिया भी है।
वैकल्पिक रूप से, हम जावा 8 के stream
एपीआई का उपयोग करने के लिए उपरोक्त को फिर से लिख सकते हैं , जो कुछ लोगों को ऊपर की तुलना में अधिक संक्षिप्त और सुपाठ्य लगता है:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
nb। कि Collectors.toList()
परिणाम सूची के बारे में बहुत कुछ की गारंटी देता है बनाता है। यदि आप यह सुनिश्चित करना चाहते हैं कि परिणाम ArrayList के रूप में वापस आए, तो Collectors.toCollection(ArrayList::new)
इसके बजाय उपयोग करें ।
तीसरा विकल्प उलटे क्रम में एक दृश्य बनाना है । यह एक अधिक जटिल समाधान है, और आगे पढ़ने / अपने स्वयं के प्रश्न के योग्य है। अमरूद की सूची # रिवर्स विधि एक व्यवहार्य प्रारंभिक बिंदु है।
"सरलतम" कार्यान्वयन चुनना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।