【问题标题】:Double-sided queue problem双面排队问题
【发布时间】:2011-02-07 21:48:45
【问题描述】:

我正在尝试运行此方法以将通用值 (EltType) 插入双面队列 (deque),但我不断收到我无法弄清楚的 outOfBoundsException。有人能帮我解决这个问题吗?这只是代码的摘录,但我认为可以从中拼凑起来!

  private final int CAPACITY = 10;
  private int capacity;
  private int end;
  private EltType deque[];  

  public ArrayBasedDeque() {
    this.capacity = CAPACITY;
    deque = (EltType[]) (new Object[capacity]);  
  }

    public void insertFirst(EltType first) {
        if(!isEmpty()) {
        EltType[] tempArray;
        tempArray = (EltType[]) new Object[CAPACITY+1];
        for (int i=0;i<=deque.length;i++) {
          tempArray[i+1] = deque[i]; 
        }
        deque = tempArray; 
        }
       deque[0] = first;
      }

  public boolean isEmpty() {
    boolean returned;
    if (deque.length < 1) {
     returned = true; 
    }else {
     returned = false; 
    }
    return returned;
  }

错误:

java.lang.ArrayIndexOutOfBoundsException: 10
    at ArrayBasedDeque.insertFirst(ArrayBasedDeque.java:48)
    at TestABD.main(TestABD.java:5)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

【问题讨论】:

    标签: java deque


    【解决方案1】:

    除了关于 &lt;= 的其他答案之外,您将临时数组大小设置为 CAPACITY+1,始终为 11。您可能的意思是:

    tempArray = (EltType[]) new Object[capacity+1];
    

    【讨论】:

    • 另外,我不建议使用仅根据大小写不同的变量名称。这是不好的做法,你可以在这里看到原因。我会将您的常量重命名为 INITIAL_CAPACITY。
    【解决方案2】:
    for (int i=0;i<=deque.length;i++) {
    

    应该改成

    for (int i=0;i<deque.length;i++) {
    

    您使用了“小于或等于”,但数组的最后一项具有 (length-1) 作为索引。

    【讨论】:

      【解决方案3】:

      正如其他发帖人所提到的,您有一个“逐一”错误,也称为栅栏错误。

      另外,您可以将isEmpty() 方法简化如下:

      public boolean isEmpty() {
          return end == 0;
      }
      

      我假设当end 为零时,这意味着双端队列中没有元素。你不应该检查deque.length,因为它只是告诉你数组可以存储多少元素,而不是数组中当前有多少。

      【讨论】:

        【解决方案4】:

        你在哪里改变你的容量?它可能不应该是一个常数。添加时大小也不会增加。

        【讨论】:

          【解决方案5】:
              for (int i=0;i<=deque.length;i++) {
          

          你应该使用&lt;,而不是&lt;=。

          【讨论】:

            【解决方案6】:

            B/c 你正在使用

             for (int i=0;i<=deque.length;i++) {
                      tempArray[i+1] = deque[i]; 
             }
            

            在 for 循环中使用

            【讨论】:

              【解决方案7】:

              附注:

              public boolean isEmpty() {
                boolean returned;
                if (deque.length < 1) {
                 returned = true; 
                }else {
                 returned = false; 
                }
                return returned;
              }
              

              没有:

              public boolean isEmpty() {
                deque.length < 1
              }
              

              看起来更简单?

              【讨论】:

              • 您错过了 return 关键字 ;)
              猜你喜欢
              • 2011-10-14
              • 2019-01-10
              • 1970-01-01
              • 1970-01-01
              • 2021-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多