2017-04-08 15 views
1

私は、Arrayという名前のオブジェクトを保持するためにArrayListを使ってカタログを構築しています。オブジェクトからの文字列がArrayListの同じオブジェクトの文字列と等しくない

私はカタログクラスのメソッドの1つに問題があります。このメソッドは、カタログを実行し、一致する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 

私はループセットに対して同じ高度を使用する方法を持っていますダブルスを比較する際にうまくいく別の方法では、

なぜこの高度なループが機能しないのか混乱しています。それが動作するかもしれないように変更。..その場合か、他のいずれかの実行IDごとに

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; 
    } 

// !!:

+0

「ID」の値は何ですか? – UnholySheep

+4

あなたはループを通過し、ループ内のすべての要素に対してif/elseを実行します。したがって、A123456を渡すと、価格が設定されますが、他の2つを見つけることはできません...すべてのインスタンスを見た後にしか見つからなかったものを印刷する必要があります – okaram

+0

何が問題なのですか?より具体的にする必要があります。 –

答えて

1

問題はここにある:

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

ポイントがある:あなた何かを発見した場合は...あなたはすぐに返す必要があります!

最初の「ブート」が一致するものとします。あなたは戻ってくる価格を覚えています。その後、あなたはループを続ける...そして2番目、3番目、...ブーツはすべてでなく、と一致します。あなたにそのメッセージを印刷してください。あなたは、あなたのようなメソッドを書き換えることができます:

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整数価格で行くことをお勧めしたい!それ以外に、もう一つの答えには良い点があります。例外について聞いた場合は、むしろ例外をスローします(「no boots found」)。 "特別な"戻り値を使用して "no boots found"と表示する代わりに!

+0

「ダブル」タイプの価格については、いい考えではありません。 –

+0

あなたは大歓迎です...あなたの例外の言及が好きでした。だから私もそれを尊重すべきです! – GhostCat

+0

助けてくれてありがとう!ソリューションが機能しました。また、メソッドにも例外を含めることにします。私はコードをテストしていて、一時的なエラーメッセージとしてそこにプリントラインを置いていました。 –

-2

は次のように試してみてください

+1

これはコンパイルされません(もしそれがあったとしても常にメッセージを出力します) – UnholySheep

+0

今度は@ynholySheepコード –

+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; 
} 

あなたはより多くの「クリーンコード」を持つようにしたい場合は、(コンソールと魔法の値を返す代わりに、印刷の)例外をスローします。

関連する問題