对 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} 之外什么也没做,所以我更加困惑,现在我正在寻求建议。