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

时间:2017-04-08 14:16:37

标签: java string object arraylist methods

我正在使用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循环不起作用。

3 个答案:

答案 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 ..改变它可能会起作用!!