зачем использовать ‘iterator’ для выполнения цикла через ArrayList. Это можно сделать и без итератора, верно?

#java #arraylist

#java #arraylist

Вопрос:

зачем использовать ‘iterator’ для выполнения цикла через ArrayList. Это можно сделать и без итератора, верно? итак, преимущества использования итератора для выполнения цикла через ArrayList

 import java.util.ArrayList;
import java.util.Iterator;

 public class IteratorDemo {
  public static void main(String[] args) {

    // Make a collection
    ArrayList<String> cars = new ArrayList<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("Mazda");

    // Get the iterator
    //Iterator<String> it = cars.iterator();

    // Looping without Iterator
    for(int i=0;i<4;i  ) {
        //System.out.println(it.next());

        System.out.println(cars.get(i));
    }
  }
 }
  

Ответ №1:

Иногда вам просто не нужен индекс, так что это проще. Но попробуйте сделать это с помощью индексированного цикла for . Это можно сделать, но не так просто.

 List<Integer> list = new ArrayList<>(
                List.of(1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10));
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
   // if even, remove it.
   if (it.next() % 2 == 0) {
      it.remove();
   }
}
System.out.println(list);
  

С принтами

 [1, 3, 5, 7, 9]
  

Использование an interator позволяет изменять списки, которые в противном случае могли бы вызвать исключение одновременной модификации.

Кроме того, предположим, что у вас была реализация класса, которая генерировала простые числа или числа Фибоначчи. Вы могли бы сделать это, чтобы захватить их по отдельности.

 Fibonacci fib = new Fibonacci(0, 1, 10);
for (long i : fib) {
    System.out.print(i   " ");
}
  

С принтами

 0 1 1 2 3 5 8 13 21 34 
  

Класс Фибоначчи

 class Fibonacci implements Iterable<Long> {
    public long start;
    public long next;
    public long count;
    
    public Fibonacci(int start, int next, int count) {
        this.start = start;
        this.next = next;
        this.count = count;
    }
    
    private class MyIterator implements Iterator<Long> {
        int n = 0;
        
        public boolean hasNext() {
            return n < count;
        }
        
        public Long next() {
            n  ;
            long ret = start;
            start = start   next;
            next = ret;
            return ret;
        }
    }
    
    public Iterator<Long> iterator() {
        return new MyIterator();
    }
}
  

Реализуя Iterable в классе, я могу использовать foreach конструкцию для получения элементов класса.

Ответ №2:

Вероятно, вам не выгодно использовать его напрямую. Но итератор используется, например, forEach .

Комментарии:

1. я думал, что вопрос был «зачем использовать итератор?». Итак, то, что я написал, является ответом на это. Не комментарий. Возможно, я тогда неправильно понял вопрос.

Ответ №3:

Просто для выполнения цикла вам не нужен итератор, достаточно цикла for . Если вам нужно изменить список, то вам это нужно, чтобы избежать ConcurrentModificationException .