【问题标题】:Java queue errorsJava 队列错误
【发布时间】:2014-03-05 18:29:59
【问题描述】:

我不断收到错误消息:线程“main”java.lang.IndexOutOfBoundsException 中的异常:索引:2,大小:2。当我在将一个值推入后弹出并查看时显示为 null。当我从一个空队列中弹出/窥视时,它给了我错误。这不是将 artay 列表与队列一起使用的正确方法吗?

 public T peek()
        {
            if(isEmpty())
                throw new RuntimeException("Can't peek here");

            return value.get(value.size()-1););
        }

public T pop()
    {
        if(isEmpty())
            throw new RuntimeException("Can't pop here");

        T number = value.get(begin);
        value.set(begin, null);
        //value.remove(value.size()-1);

        begin++;
        return number;
    }

【问题讨论】:

    标签: java list queue


    【解决方案1】:

    在获得begin 之后,立即将其设置为空。当您将begin 设置为null 时,您也将number 设置为null,因为number 和begin 引用了同一个对象。

    从队列中“弹出”的正确方法如下:

    • 参考第一项
    • 从列表中删除项目
    • 返回参考

    在代码中,它看起来像这样。对于我的示例,我假设 value 是您的 ArrayList。也许values 是一个不那么容易混淆的名字。

    T number = value.get(0); // Reference the first item
    value.remove(0) // Remove it from the list
    return number; // Return the reference
    

    在执行任何这些操作之前,您应该检查您的列表是否为空。

    if(val.size() > 0) {
        // Do Stuff
    } else {
        throw CannotPopFromAnEmptyQueueException();
    }
    

    值得一提的是,在谈论队列时,“pop”并不是一个好词。 EnqueueDequeue 是更正式的术语。 Poppush 是堆栈术语。

    【讨论】:

      【解决方案2】:

      在第一次 pop/peek 之后,您的队列中将有一个元素的值等于“null”

      PSB 摘自您的代码:

      T number = value.get(begin);
      value.set(begin, null);
      //value.remove(value.size()-1);
      
      begin++;
      

      在第一次迭代中,begin 将等于 0。因此,您正在执行 value.set(0, null) 和 begin++ 之类的操作,因此现在 begin=1。

      所以当你下次去执行 pop/peek 时,实际上你会尝试获取索引 1 处不存在的元素,因此你会得到这个 indexOutOfBoundException。

      【讨论】:

      • 没错,你不应该像这样递增。在您的情况下,您可能可以检查数组列表的大小,并确保开始计数器在增量后永远不会超过该大小。
      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2018-02-07
      • 2013-02-23
      • 1970-01-01
      相关资源
      最近更新 更多