来自对象的字符串不等于来自 ArrayList 中同一对象的字符串



我正在使用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()+"nn");
}
}
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 循环不起作用。

问题就在这里:

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 +"nn");
return -1;

但这并不是一个好的解决方案:你真的不希望某些搜索方法放置用户消息。相反,调用此方法的代码会检查结果;如果 -1 回来,它知道没有找到靴子;并可以给出消息。

并记录在案:浮点数伴随着微妙的舍入和精度问题; 当你处于学习阶段时;我宁愿推荐int整数价格!除此之外,另一个答案有一个很好的观点:如果你听说过异常,那么宁愿抛出一个例外("找不到靴子");而不是使用"特殊"返回值来指示"未找到靴子"!

您的搜索循环中存在错误,@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+"nn");
return -1.0;
}

如果你想要有更多的"干净代码",那么抛出一个异常(而不是打印到控制台并返回一个魔术值)。

像这样尝试:

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+"nn"); }
return price;
}

对于每个 ID 执行 if 或 else.. 像这样更改它可能会起作用!!

最新更新