Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2020, 22:37   #1
soporific228
Новичок
Джуниор
 
Регистрация: 18.01.2020
Сообщений: 1
По умолчанию Queue используя односвязный список

Помогите пожалуйста разобраться с методом remove() используя iterator.
У меня почему-то не удаляется последнее вхождение после метода next().

Код прилагаю ниже + в методе test7() указан какой должен быть вывод

Код:
import java.util.Iterator;
import java.util.NoSuchElementException;
 
public class QueueImpl implements Queue {
    private Node head;
    private Node tail;
    int current = 0;
 
    @Override
    public void enqueue(Object element) {
        Node a = new Node();
        a.element = element;
 
        if (tail == null) {
            head = a;
            tail = a;
        } else {
            tail.next = a;
            tail = a;
        }
        current++;
    }
 
    @Override
    public Object dequeue() {
        Node element = head;
        head = element.next;
        current--;
        return element.element;
    }
 
    @Override
    public Object top() {
        return head.element;
    }
 
    @Override
    public void clear() {
        current = 0;
        head = null;
        tail = null;
    }
 
    @Override
    public int size() {
        return current;
    }
 
    class Node {
        Object element;
        Node next;
        Node prev;
    }
 
    @Override
    public Iterator<Object> iterator() {
        return new IteratorImpl();
    }
 
    public class IteratorImpl implements Iterator<Object> {
 
        Node iteratorImpl = head;
        Node follow;
 
        @Override
        public boolean hasNext() {
            return iteratorImpl != null;
        }
 
        @Override
        public Object next() {
            follow = iteratorImpl;
            iteratorImpl = iteratorImpl.next;
            return follow.element;
        }
 
        @Override
        public void remove() {
            Node current = head;
 
            while (current != follow) {
                if (current.next == tail) {
                    tail = current;
                    break;
                } else {
                    current = current.next;
                }
            }
        }
    }
 
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        Node current = head;
 
        while (current != null) {
            if (current.next == null) {
                stringBuilder.append(current.element);
            } else {
                stringBuilder.append(current.element).append(" ");
            }
            current = current.next;
        }
 
        return "[" + stringBuilder.toString() + "]";
    }
 
    public static void main(String[] args) {
        test7();
    }
 
    public static void test7() {
 
        Queue queue = new QueueImpl();
        queue.enqueue("A");
        queue.enqueue("B");
        queue.enqueue("C");
 
        Iterator it = queue.iterator();
 
        System.out.println(it.next());
        System.out.println(it.next());
        System.out.println(it.next());
        it.remove();
        System.out.println(queue);
 
        it = queue.iterator();
 
        System.out.println(it.next());
        it.remove();
        System.out.println(queue);
 
        it = queue.iterator();
 
        System.out.println(it.next());
        it.remove();
        System.out.println(queue);
 
        /* an output must be as the following:
        *************************************
        A
        B
        C
        [A, B]
        A
        [B]
        B
        []
        *************************************
        */
    }
}
soporific228 вне форума Ответить с цитированием
Старый 04.02.2020, 00:36   #2
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

it.remove() у вас будет работать непосредственно для текущего взятого итератора. Когда вы делаете System.out.println(queue);, у вас будет выводиться каждый раз полная очередь, состоящая из всех трех элементов, так как будет вызываться метод toString(), определенный для очереди. В котором вы тоже "итерируетесь" по очереди, но уже с помощью явного перехода по ссылкам, не используя объект класса Iterator. Для удаления первого элемента из очереди используйте ваш метод dequeue(), для удаления всех элементов используйте метод clear()
NikiToZz_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часть кода сделал. Односвязный список без заглавного звена. Динамическая память. Перевернуть список и считать в обратном порядке. Varner Общие вопросы Delphi 5 19.05.2016 17:30
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Односвязный список.??? Дмитрий_Попов Общие вопросы C/C++ 0 14.12.2011 21:10
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52