我正在使用 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 循环,该方法在比较 double 方面效果很好。
我很困惑为什么这个高级 for 循环不起作用。
最佳答案
问题出在这里:
for(Boot b : catalogue){
if(b.getID().equals(ID)){
price = b.getPrice();
}
else{ ...
}
}
return price;
要点是:如果您发现某些东西......您应该立即返回!
假设第一个“boot”匹配;然后你记住返回的价格。然后继续循环...第二个、第三个... Boot 将全部不匹配;并将该消息打印给您。您可以重写您的方法,如下所示:
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,则表明没有找到 Boot ;并可以留言。
郑重声明: float 会带来微妙的舍入和精度问题;当你处于学习阶段时;我宁愿建议使用 int
整数价格!除此之外,另一个答案有一个很好的观点:如果您听说过异常,那么宁愿抛出异常(“找不到 Boot ”);而不是使用“特殊”返回值来指示“未找到 Boot ”!
关于java - 对象中的字符串不等于 ArrayList 中同一对象的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43295174/