Как написать следующий метод с итератором и MaxHeapPriorityQueue в Java - PullRequest
0 голосов
/ 11 мая 2019

Мне нужна помощь в написании этого метода next () в этом классе. Я пробовал несколько вещей, но я продолжаю получать, что я не возвращаю следующее значение, а скорее ноль.

Инструкции для этого класса гласят: Этот класс должен быть общедоступным, нестатичным и должен реализовывать java.util.Iterator. Его переменная экземпляра индекса должна быть инициализирована с соответствующим значением. Его метод hasNext () должен возвращать true, если какие-либо элементы в очереди еще не были возвращены его методом next (). Его метод next () должен возвращать значения очереди в том же порядке, что и в базовом массиве.

Поэтому я собираюсь написать код, который у меня есть, но обрежу его так, чтобы показывались только важные элементы, относящиеся к моей проблеме.

public class MaxHeapPriorityQueue<E extends Comparable<E>>
{
private E[] elementData;
private int size;

@SuppressWarnings("unchecked")
public MaxHeapPriorityQueue()
{
    elementData = (E[]) new Comparable[10];
    size = 0;
}
public Iterator<E> iterator()
{
    return new MHPQIterator();
}

и здесь находится другой класс, связанный с методом Iterator.

public class MHPQIterator implements java.util.Iterator<E>
{
    private int index;

    public boolean hasNext()
    {
        if(size == 0)
        {
            return false;
        }
        else
        {
            return (index < size);
        }
    }
    public E next()
    {
        return elementData[index];
    }
}

Я не уверен, сработает ли elementData, но я не знаю, что еще я мог бы вернуть.

Ответы [ 3 ]

1 голос
/ 11 мая 2019

Как это:

public class MHPQIterator implements java.util.Iterator<E>
{
    private int index=0;

    public boolean hasNext()
    {
        return (index < size);
    }
    public E next()
    {
        return elementData[index++];
    }
}
1 голос
/ 11 мая 2019

Прежде всего, я понимаю, что ваши данные находятся внутри elementData, а размер дает количество элементов, хранящихся внутри.

iterator () дает вам итератор. Ваша реализация Iterator имеет индекс как указатель на текущий элемент.

Что вы планируете хранить внутри индекса? Я вижу 2 возможности: а) он дает вам текущее местоположение данных. Первый элемент в массиве - это элемент 0, поэтому до этого я бы инициализировал его как -1. б) Это может быть визуально. Таким образом, он инициализируется как 0 сначала, а затем 1 означает: первый элемент, который будет elementData [0]. ==> Это просто внутренняя переменная, поэтому она полностью зависит от вас, что вы хотите хранить внутри нее.

Теперь давайте посмотрим на ваш метод hasNext. Если sizer равен 0, тогда не может быть следующего элемента. Хорошо. Но тогда вы проверяете, является ли iterator () пустым? Итератор всегда возвращает новый экземпляр вашего внутреннего класса итератора. Так что это всегда будет ненулевым! Так что это кажется неправильным.

У вас есть индекс и размер. Так что вам просто нужно проверить, указывает ли индекс уже на последний элемент. Так что в зависимости от выбора a / b выше, вы просто должны проверить, если index + 1

А потом следующая функция: - Это должно подтвердить, что есть еще один элемент. (=> hasNext) - вы увеличиваете индекс - вы возвращаете элемент, на который указывает указатель (elementData [index] или elementData [index-1] (снова зависит от вашего решения, что хранить внутри индекса)

Мой совет - поиграть с ним с бумагой и ручкой. Просто напишите экземпляр вашего класса, например, 3 элемента (т.е. elementData [0], elementData [1], elementData [2] имеет некоторое значение, размер = 3). Вы создаете новый экземпляр вашего итератора, индекс инициализируется, а затем смотрите, что должно произойти.

Возможный класс, который показывает реализацию: import java.util.Iterator;

public class MaxHeapPriorityQueue<E extends Comparable<E>> {
    private E[] elementData;
    private int size;

    @SuppressWarnings("unchecked")
    public MaxHeapPriorityQueue() {
        elementData = (E[]) new Comparable[10];
        size = 0;
    }

    public void add(E data) {
        if (size == 10) throw new IllegalStateException("Queue full");

        elementData[size] = data;
        size++;
    }

    public Iterator<E> iterator() {
        return new MHPQIterator();
    }

    public class MHPQIterator implements java.util.Iterator<E>
    {
        private int index=-1;

        public boolean hasNext()
        {
            return (index+1)<size;
        }

        public E next()
        {
            index++;
            return elementData[index];
        }
    }

    public static void main (String[] args) {
        MaxHeapPriorityQueue<Integer> queue = new MaxHeapPriorityQueue<>();
        Iterator<Integer> iterator = queue.iterator();

        System.out.println("Empty queue:");
        while (iterator.hasNext())
            System.out.println(iterator.next());

        queue.add(1);

        System.out.println("Queue with 1 element (1):");
        iterator = queue.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());

        queue.add(2);
        queue.add(3);
        queue.add(4);

        System.out.println("Queue with 4 elementa (1,2,3,4):");
        iterator = queue.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }
}
0 голосов
/ 11 мая 2019

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

public class MHPQIterator implements java.util.Iterator<E>
{
    private int index;

    public boolean hasNext()
    {
        if(size == 0)
        {
            return false;
        }
        else
        {
            return (index < size);
        }
    }
    public E next()
    {
        index++;
        return elementData[index];
    }
}
...