【问题标题】:How to write a next method with an Iterator and a MaxHeapPriorityQueue in java如何在 java 中使用 Iterator 和 MaxHeapPriorityQueue 编写下一个方法
【发布时间】:2019-09-29 06:08:25
【问题描述】:

我需要帮助在这个类中编写这个 next() 方法。我已经尝试了几种方法,但我一直认为我没有返回下一个值,而是返回 null。

该类的说明如下:该类应该是公共的、非静态的,并且应该实现 java.util.Iterator。它的索引实例变量应该用适当的值初始化。如果队列中的任何元素尚未由其 next() 方法返回,则它的 hasNext() 方法应返回 true。它的 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 是否可以工作,但我不知道我还能返回什么。

【问题讨论】:

    标签: java iterator queue heap next


    【解决方案1】:

    首先,我的理解是,您的数据在 elementData 内部,而 size 给出了存储在内部的元素数量。

    iterator() 给你一个迭代器。您的 Iterator 实现将索引作为指向当前元素的点。

    你打算在索引中存储什么?我看到了两种可能性: a)它为您提供当前数据位置。数组中的第一个元素是元素 0,所以在此之前,我会将其初始化为 -1。 b) 它可以是视觉的。所以它首先初始化为 0,然后 1 表示:第一个元素,即 elementData[0]。 ==> 它只是一个内部变量,所以完全取决于你,你想在里面存储什么。

    现在让我们看看你的 hasNext 方法。如果 sizer 为 0,则不能有下一个元素。好的。但是然后您检查 iterator() 是否为空?迭代器总是返回你的内部迭代器类的一个新实例。所以它永远是非空的!所以这似乎是错误的。

    你有索引和大小。所以你只需要检查索引是否已经指向最后一个元素。因此,根据上面的选择 a/b,您只需检查 index+1

    然后是下一个函数: - 它必须验证是否存在另一个元素。 (=> 有下一个) - 你增加指数 - 您返回元素,索引指向 (elementData[index] 或 elementData[index-1] (再次取决于您决定在索引中存储什么)

    我的提示是,用纸和笔玩弄它。只需使用例如编写您的类的实例3 个元素(所以 elementData[0]、elementData[1]、elementData[2] 有一些值,size = 3。您创建了一个迭代器的新实例,索引已初始化,然后看看会发生什么。

    显示实现的可能类是: 导入 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());
        }
    }
    

    【讨论】:

    • 哦,谢谢,这清楚了很多,我相信我正在使用迭代器,因为我的 elementData 只是一直返回 null。
    • 由于没有 elementData 可查看,如何使用迭代器找到它?
    • 你是作为内部类做的吗?内部类可以访问父类。很快就做了一个你可以检查的实现。将其作为另一个答案发布(以便您可以看到代码!)
    • 我确实有一个父方法。
    • 不是父方法 - 父类。我们正在谈论内部阶级。我编辑了我的答案并将示例代码放在那里。
    【解决方案2】:

    像这样:

    public class MHPQIterator implements java.util.Iterator<E>
    {
        private int index=0;
    
        public boolean hasNext()
        {
            return (index < size);
        }
        public E next()
        {
            return elementData[index++];
        }
    }
    

    【讨论】:

    • 不,这行不通,我不能让索引等于 0。我有运行它的测试。
    • 而且 elementData 也只是返回 null,所以我认为 elementdata 不应该在那里。
    • 这也应该有效。它甚至更好地使用索引。如果我用文字来描述它,那么我会说它已经指向下一个元素。所以初始化是0(不是我的代码中的-1),检查不需要+1,然后在返回元素后增加索引(使用index++)。但是 index++ 是我一直尽量避免的。 (干净的代码 - 避免错误。)
    【解决方案3】:

    这是对我有用的方法,但是答案已发布在这里并且我接受了它,但这是我的代码适用的方法。

    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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多