java - Iterator को ArrayList में कनवर्ट करें




(8)

आप अपाचे commons-collections से IteratorUtils भी उपयोग कर सकते हैं, हालांकि यह जेनरिक का समर्थन नहीं करता है:

List list = IteratorUtils.toList(iterator);

Iterator<Element> को देखते हुए, हम Iterator को ArrayList<Element> (या List<Element> ) में सबसे अच्छे और तेज़ तरीके से कैसे परिवर्तित कर सकते हैं, ताकि हम उस पर ArrayList के संचालन का उपयोग कर सकें जैसे कि get(index) , add(element) , आदि


आप एक इटरेटर को इस तरह की एक नई सूची में कॉपी कर सकते हैं:

Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
    copy.add(iter.next());

यह माना जा रहा है कि सूची में तार हैं। वास्तव में एक इटरेटर से एक सूची को फिर से बनाने का एक तेज़ तरीका नहीं है, आप इसे हाथ से घुमाने के साथ फंस गए हैं और प्रत्येक तत्व को उचित प्रकार की एक नई सूची में कॉपी कर रहे हैं।

संपादित करें:

एक प्रकार की सुरक्षित सूची में एक नई सूची में एक इटरेटर की प्रतिलिपि बनाने के लिए एक सामान्य विधि यहां दी गई है:

public static <T> List<T> copyIterator(Iterator<T> iter) {
    List<T> copy = new ArrayList<T>();
    while (iter.hasNext())
        copy.add(iter.next());
    return copy;
}

इसे इस तरह प्रयोग करें:

List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);
System.out.println(copy);
> [1, 2, 3]

गूगल guava प्रयोग करें!

Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);

++


जावा 8 के साथ आप इस समाधान का उपयोग कर सकते हैं:

Iterable<Element> iterator = createIterator();
List<Element> array = StreamSupport
    .stream(iterator.spliterator(), false)
    .collect(Collectors.toList());

जैसा कि मैं Collectors.toList() जानता हूं। सूची Collectors.toList() ArrayList उदाहरण बनाता है।

दरअसल मेरी राय में, यह एक पंक्ति में भी अच्छा दिखता है।
उदाहरण के लिए यदि आपको कुछ विधि से List<Element> वापस करने की आवश्यकता है:

return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());

मैं बस एक स्पष्ट रूप से स्पष्ट समाधान को इंगित करना चाहता हूं जो काम नहीं करेगा :

List list = Stream.generate(iterator::next)
    .collect(Collectors.toList());

ऐसा इसलिए है क्योंकि Stream#generate(Supplier<T>) केवल अनंत धाराएं बना सकता है, यह उम्मीद नहीं करता है कि इसके तर्क NoSuchElementException को फेंकने की उम्मीद नहीं है (यही अंत में Iterator#next() अंत में करेगा)।

share → स्ट्रीम → सूची तरीका आपकी पसंद है, तो share इस्तेमाल किया जाना चाहिए।


यहां इस मामले में यदि आप सबसे तेज़ तरीका चाहते हैं तो for loop बेहतर है।

10,000 runs नमूना आकार पर इटेटरेटर 40 ms लेता है जहां लूप के लिए 2 ms लगता है

        ArrayList<String> alist = new ArrayList<String>();  
        long start, end;  

        for (int i = 0; i < 1000000; i++) {  
            alist.add(String.valueOf(i));  
        }  

        ListIterator<String> it = alist.listIterator();      

        start = System.currentTimeMillis();  
        while (it.hasNext()) {  
            String s = it.next();  
        }  
        end = System.currentTimeMillis();  

        System.out.println("Iterator start: " + start + ", end: " + end + ", delta: "  
            + (end - start));  
        start = System.currentTimeMillis();  
        int ixx = 0;  
        for (int i = 0; i < 100000; i++) {  
            String s = alist.get(i);  
        }  

        System.out.println(ixx);  
        end = System.currentTimeMillis();  
        System.out.println("for loop start: " + start + ", end: " + end + ", delta: "  
            + (end - start));  

यह माना जा रहा है कि सूची में तार हैं।


Cactoos से StickyList आज़माएं :

List<String> list = new StickyList<>(iterator);

अस्वीकरण: मैं डेवलपर्स में से एक हूं।


Guava जैसे लाइब्रेरी का बेहतर उपयोग करें:

import com.google.common.collect.Lists;

Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);

एक अन्य अमरूद उदाहरण:

ImmutableList.copyOf(myIterator);

या अपाचे कॉमन्स संग्रह :

import org.apache.commons.collections.IteratorUtils;

Iterator<Element> myIterator = ...//some iterator

List<Element> myList = IteratorUtils.toList(myIterator);       




iterator