[英]EDITED: Binary insertion not working as I think it should
仍然對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}外,什么也沒做,所以我更加困惑了,現在我正在尋求建議。
int high = (arr.size());// the why
也許您應該通過以下方式更新代碼:
high = arr.size() - 1;
mid = low + (high - low) / 2;
//否則,當低點和高點很大時(如果大小很大),它可能會溢出整數; int cmp = arrComp.compare(arr.get(mid), item);
//避免無意義的比較;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.