2017-04-08 48 views
1

我使用一個ArrayList舉行一個名爲boot對象建立一個目錄。字符串確實來自同一個對象不等於字符串中的一個ArrayList

我haverun到一個問題,在我的目錄類的方法之一。該方法應該遍歷目錄並找到具有匹配ID(字符串值)的引導對象。

該目錄充滿了這些對象;像這樣:

Boot boot1 = new Boot("Extreme Hiking Boot", "A123456", "For extreme terrains", "Khaki", "Canvas", "For all terrains", 65.50, 100, 5); 
Boot boot2 = new Boot("Casual Hiker", "B123456", "A hiking boot for the casual person", "Brown", "Leather", "Rocky", 55.95, 200, 3); 
Boot boot3 = new Boot("Broken Boot", "Y123456","A broken boot", "Yellow", "Plastic", "Soft Ground", 110.45, 400, 1); 

這裏是造成問題的方法:

public double getPriceForProduct(String ID){ 
    double price = -1.0; 

    for(Boot b : catalogue){ 
     if(b.getID().equals(ID)){ 
      price = b.getPrice(); 
     } 
     else{ 
      System.out.println("We don't have a boot with that ID in stock."); 
      System.out.println(b.getID()+"\n\n"); 
     } 
    } 
    return price; 
} 

它這個返回到我的控制檯:

We don't have a boot with that ID in stock. 
B123456 


We don't have a boot with that ID in stock. 
Y123456 


We don't have a boot with that ID in stock. 
A123456 


We don't have a boot with that ID in stock. 
Y123456 

我有一個使用相同的先進的循環集的方法另一種方法可以很好地比較雙打。

我很困惑,爲什麼這種先進的循環無法正常工作。

+0

「ID」的價值是什麼? – UnholySheep

+4

你正在經歷循環,併爲循環中的每個元素做if/else ..所以,當你通過A123456時,它會爲它設置價格,但仍然打印它找不到其他兩個...你需要打印你沒有找到它後,你已經看過每個實例 – okaram

+0

究竟是什麼問題?你必須更具體。 –

回答

1

的問題是在這裏:

for(Boot b : catalogue){ 
    if(b.getID().equals(ID)){ 
     price = b.getPrice(); 
    } 
    else{ ... 
    } 
} 
return price; 

的觀點是:如果你發現東西 ......你應該立即返回!

假設第一個「啓動」匹配;那麼你就記得那個價格要回來了。然後你繼續循環...和第二,第三,...靴子將全部不是匹配;並將該消息打印給你。你可以重寫你的方法,如:

public double getPriceForProduct(String ID){ 
for(Boot b : catalogue){ 
    if(b.getID().equals(ID)){ 
     return b.getPrice(); 
    } 
} 
System.out.println("We don't have a boot with that ID in stock."); 
System.out.println(ID +"\n\n"); 
return -1; 

但是,這不是個很好的辦法:你真的不想要一些搜索方法提出了用戶的消息。相反,稱爲的代碼檢查結果;如果-1回來,它知道沒有找到靴子;並可以給出消息。

並記錄:浮點數字帶有微妙的舍入和精度問題;並且正處於學習階段;我寧願推薦使用int整數價格!除此之外,另一個答案有一個很好的觀點:如果你聽說過異常,那就拋出一個異常(「找不到靴子」);而不是使用「特殊」返回值來表示「找不到靴子」!

+0

喜歡說'雙'價格是不是一個好主意。 –

+0

不客氣......我喜歡你提到的例外;所以我也應該尊重這一點! – GhostCat

+0

感謝您的幫助!您的解決方案奏效我也一定會在方法中包含例外。我正在測試代碼並將打印行作爲臨時錯誤消息。 –

-2

嘗試像這樣:

public double getPriceForProduct(String ID){ 
double price = -1.0; 
boolean flag=true; 

for(Boot b : catalogue){ 
    if(b.getID().equals(ID)){ 
     price = b.getPrice(); 
     flag=false; 
     break; 
    }} 
    if(flag==true){ 
     System.out.println("We don't have a boot with that ID in stock."); 
     System.out.println(ID+"\n\n"); } 

return price; 
    } 

//對於每一個ID或者如果要不這樣執行..改變一樣,它可以工作!

+1

這將不會編譯(如果它確實會*總是*打印郵件) – UnholySheep

+0

現在tyr代碼@UnholySheep –

+0

你需要放鬆和寫代碼,因爲那裏有錯誤 –

1

您的搜索循環中出現錯誤,因爲@okaram提到的正確。這應該可以解決它:

public double getPriceForProduct(String ID){ 
    for(Boot b : catalogue){ 
    if(b.getID().equals(ID)){ 
     return b.getPrice(); 
    } 
    } 

    System.out.println("We don't have a boot with that ID in stock:\n"); 
    System.out.println(ID+"\n\n"); 

    return -1.0; 
} 

如果你想有更多的「乾淨的代碼」,然後拋出一個異常(而不是打印到控制檯,並返回一個魔法值)。

相關問題