почему мы не создаем новый объект итератора в этом случае? - PullRequest
0 голосов
/ 16 октября 2018

это действительно очень смутило меня.В принципе, я хочу распечатать элементы двух 1d-вектора поочередно.И я нашел решение, приложенное ниже, написанное другими.В методе main мы вызываем zigzagIterator.next(), чтобы напечатать число, возвращаемое int num = iter.next()

. В методе next() создается впечатление, что он создает новый объект iter каждый раз, когда метод next() имеетбыл вызван.Но когда я отлаживал, я обнаружил, что только два объекта итератора были созданы.один для а1, другой для а2.Так что курсор в каждом объекте итератора сохраняет свою память для итерации до конца.

Мне просто не имеет смысла, что Iterator<Integer> iter = deque.pollLast() вызывался несколько раз, но были созданы только два объекта.Надеюсь, кто-то может помочь!Большое спасибо.

public class ZigzagIterator {
Deque<Iterator<Integer>> deque;

public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
    deque = new LinkedList<Iterator<Integer>>();
    if(v1.size() != 0) deque.offerFirst(v1.iterator());
    if(v2.size() != 0) deque.offerFirst(v2.iterator());
}

public int next() {
    Iterator<Integer> iter = deque.pollLast();
    int num = iter.next();
    if(iter.hasNext()) deque.offerFirst(iter);
    return num;
}

public boolean hasNext() {
    return (deque.size() != 0);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Integer> a1= new ArrayList<Integer>();
    a1.add(1);
    a1.add(2);
    a1.add(12);
    List<Integer> a2= new ArrayList<Integer>();
    a2.add(3);
    a2.add(4);
    a2.add(5);
    a2.add(6);
    ZigzagIterator zigzagIterator=new ZigzagIterator(a1, a2);
    while (zigzagIterator.hasNext()) 
    System.out.println(zigzagIterator.next());
}
}

1 Ответ

0 голосов
/ 16 октября 2018

Это потому, что ссылка на объект остается неизменной, в то время как созданные новые объекты присваиваются 2 ссылкам (v1, v2).таким образом, последний 2 объект получит 2 ссылки, в результате чего получится 2 пригодных для использования объекта, в то время как другие будут собираться мусором

посетить https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html

...