仍然是Java的新手;我们的教授希望我们在将ArrayList元素添加时使用非递归二进制搜索。我不断遇到出站异常,而我只是找不到原因。我还注意到调试和逐步操作时的异常行为。对于我的一生,我似乎无法从逻辑上弄清楚这一点。他还希望我们也为此使用compare方法。我的问题是弄清楚为什么/如何使数组越界越好。任何指示和建议将不胜感激.....我们的教授年龄较大,需要DAYS才能通过电子邮件回来,而且我没有那么长的时间来解决这个问题。这是唯一让我无法完成剩余任务的事情。
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);
}
}
}
都可以运行该方法,但实际上都没有填充arraylist。我不明白为什么这不起作用,从逻辑上讲应该填充数组,否则吗?这次运行没有错误,但实际上什么也没做。数组大小为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);
}
}
我的循环初始化在其他地方。截至目前,在初始化arraylist时,使用上述enqueue方法,我的输出为{2,3,4,5,6,6,1}。我无法为自己的一生而得到这份订单。授予,我的初始化已经按顺序进行了,但是根据我们的分配,在添加到列表中时,我们必须使用二进制搜索方法对此进行初始化。
为什么第一个初始化项保留在列表的末尾? (1),当所有其他值都添加到它们的正确位置时?是否仅是因为ArrayLists的.add方法添加到列表的末尾,即使它是我要添加的第一个值(如果列表大小当前为0,则使用.add方法)吗?我该如何解决?
我最初的解决方案,即代码的注释部分,除了使输出为{3,4,5,6,1,2}外,什么也没有做,所以我更加困惑了,现在我正在寻求建议。
>答案 0 :(得分:2)
int high = (arr.size());// the why
也许您应该通过以下方式更新代码:
high = arr.size() - 1;
mid = low + (high - low) / 2;
//否则,当低点和高点很大时(如果大小很大),它可能会溢出整数; int cmp = arrComp.compare(arr.get(mid), item);
//避免无意义的比较;