我正在使用ArrayList构建一个目录来保存一个名为boot的对象。
我遇到了我的目录类中的一个方法的问题。该方法应该在目录中运行,并找到具有匹配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
我有一个方法,在另一个方法中使用相同的高级for循环设置,在比较双精度时工作正常。
我很困惑为什么这个高级for循环不起作用。
答案 0 :(得分:1)
问题在于:
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;
重点是:如果你找到某事......你应该马上回来!
假设第一个" boot"火柴;然后你记得要回报的价格。然后你继续循环...而第二,第三,......靴子将全部不匹配;并将该消息打印给您。您可以重写您的方法,如:
int
但这不是一个很好的解决方案:你真的不希望某些搜索方法提出用户消息。相反,调用此方法的代码会检查结果;如果-1回来,它知道没有找到靴子;并且可以给出消息。
并且记录:浮点数带有微妙的舍入和精度问题;当你处于学习阶段;我宁愿建议使用git clean
整数价格!除此之外,另一个答案有一个好处:如果你听说过异常,那么就抛出异常("没有找到靴子");而不是使用"特殊"返回值指示"未找到靴子"!
答案 1 :(得分: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;
}
如果你想拥有更多“干净的代码”,那么抛出一个异常(而不是打印到控制台并返回一个魔术值)。
答案 2 :(得分:-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执行if if else else ..改变它可能会起作用!!