-1

对 Java 来说还是新事物;我们的教授希望我们在向此 ArrayList 添加元素时使用非递归二进制搜索。我不断遇到越界异常,我就是不知道为什么。在调试和逐步进行时,我还注意到异常行为。对于我的一生,我似乎无法从逻辑上弄清楚这一点。他还希望我们也为此使用比较方法。我的问题是弄清楚为什么/如何让数组越界。任何指点和建议将不胜感激.....我们的教授年纪大了,需要几天时间才能通过电子邮件回复,我没有那么长的时间来解决这个问题。这是唯一让我无法完成剩下的任务的事情。

    public void enqueue(E item) {
    if(arr.size() == 0) {
        arr.add(item);
    }else {
        int low = 0;
        int high = (arr.size());
        while (low <= high){
            int mid = (low + high)>>1;
            if(arrComp.compare(arr.get(mid), item) < 0){
                low = (mid + 1);
            }
            else if (arrComp.compare(arr.get(mid), item) > 0){
                high = (mid - 1);
            }
            else{
                arr.add(mid,item);
            }
        }
    }
}   

***编辑当我这样做时:

int low = 0;
int high = (arr.size() - 1);
while (low <= high){
    int mid = (low + high) / 2;
    if(arrComp.compare(arr.get(mid), item) < 0){
        low = (mid + 1);
    }
    else if (arrComp.compare(arr.get(mid), item) > 0){
        high = (mid - 1);
    }
    else{
        arr.add(mid,item);
    }
}

}

或这个:

            if(arr.size() == 0){
                     arr.add(item)
}
            int low = 0;
            int high = (arr.size() - 1);
            while (low <= high){
                int mid = (low + high) / 2;
                if(arrComp.compare(arr.get(mid), item) < 0){
                    low = (mid + 1);
                }
                else if (arrComp.compare(arr.get(mid), item) > 0){
                    high = (mid - 1);
                }
                else{
                    arr.add(mid,item);
                }
            }

    }

两者都让方法运行,实际上都没有填充数组列表。我不明白为什么这不起作用,从逻辑上讲它应该填充数组不应该吗?这次它运行没有错误,但基本上什么也没做。数组大小为0,运行后没有元素,但至少现在运行。


几乎完全解决了我的问题,但现在出现了一个我无法弄清楚的新问题!!!!

        public void enqueue(E item) {
        int low = 0;
        int high = (arr.size());
        int mid =0;
        int cmp;
        if(arr.size()==0) {
            arr.add(item);
        }/**
        else if(arr.size()==1) {
            cmp = arrComp.compare(arr.get(0), item);
            if(cmp < 0){
                arr.add(item);
            }
            else {
                arr.add(0,item);
            }
        } **/
        else {
            while (low < high){
                mid = (low + high) / 2;
                cmp = arrComp.compare(arr.get(mid), item);
                if(cmp < 0){
                    low = (mid + 1);
                }
                else if (cmp > 0){
                    high = (mid - 1);
                }                   
            }
            arr.add(mid, item);
        }

}

我的循环初始化在别处。截至目前,我的输出是 {2, 3, 4, 5, 6, 1} 在我初始化数组列表时使用上述入队方法。我不能为我的生活得到这个来填补它。当然,我的初始化已经按顺序进行了,但是根据我们的分配,我们必须在添加到列表时使用二进制搜索方法对其进行初始化。

为什么第一个初始化的项目留在列表的末尾?(1),当所有其他值被添加到它们的正确位置时?仅仅是因为 ArrayLists 的 .add 方法添加到列表的末尾,即使它是我添加的第一个值(如果列表大小当前为 0,则使用 .add 方法)?我怎样才能解决这个问题?

我最初的解决方案是代码的注释部分,除了输出 {3, 4, 5, 6, 1, 2} 之外什么也没做,所以我更加困惑,现在我正在寻求建议。

4

1 回答 1

2
 int high = (arr.size());// the why

也许您应该通过以下方式更新您的代码:

  1. high = arr.size() - 1;
  2. mid = low + (high - low) / 2;// 否则当 low 和 high 很大时(如果 size 很大)它可能会溢出整数;
  3. int cmp = arrComp.compare(arr.get(mid), item);// 避免无意义的比较;
于 2018-07-31T15:21:47.723 回答