1

ifステートメントを含むforeachループを使用するこのメソッドがあります

public static Apartment getApartment(String aNumber)
    
//for loop to iterate through the list of apartments         
{   
for (Apartment x : listOfApartments) 
  { 
  // Variable to hold the value of returned apartment    
  if (x.getApartmentNo().equalsIgnoreCase(aNumber))
  { Apartment chosen = x;
  }
  else 
  {JOptionPane.showMessageDialog(null, "Apartment not found");
  }
 
}  
return chosen;
} 

選択したシンボルが見つからないというエラーが発生します。変数を間違った場所で宣言したと思います。何か助けはありますか?注:これは、文字列を受け取り、オブジェクトアパートメントを返すメソッドです。

4

9 に答える 9

3

ループを書き直す必要があります。ループが終了するまで、アパートが見つからないと判断しないでください。一時変数にも値を割り当てる必要はありません。アパートが見つかったら、すぐに返します。

ループを終了したときだけアパートが見つからないことを報告できます。

for (Apartment x : listOfApartments) { 
    // Variable to hold the value of returned apartment    
    if (x.getApartmentNo().equalsIgnoreCase(aNumber)) {
        return x;
    }
}
JOptionPane.showMessageDialog(null, "Apartment not found");
return null;
于 2012-04-25T04:18:19.003 に答える
1

条件「x.getApartmentNo()。equalsIgnoreCase(aNumber)」がfalseと評価された場合はどうなりますか?
Apartmentデータ型「chosen」は作成されません!
インスタンス化されていないものをどのように返すことができますか?

于 2012-04-25T04:17:19.360 に答える
1

これはスコープの問題です。Chosenはifステートメントの横に作成されます。

外部で宣言してnullに設定すると、関数は条件がtrueの場合はchosenを返し、そうでない場合はnullを返します。

public static Apartment getApartment(String aNumber)

//for loop to iterate through the list of apartments         
{   
Apartment chosen = null;

for (Apartment x : listOfApartments) 
  { 
  // Variable to hold the value of returned apartment    
  if (x.getApartmentNo().equalsIgnoreCase(aNumber))
  { chosen = x;
  }
  else 
  {JOptionPane.showMessageDialog(null, "Apartment not found");
  }

}  
return chosen;
}
于 2012-04-25T04:18:45.827 に答える
1

メソッドを作成する簡単な(そして正しい)方法は次のとおりです。

public static Apartment getApartment(String aNumber) {
    for (Apartment x : listOfApartments)
      if (x.getApartmentNo().equalsIgnoreCase(aNumber))
        return x;
    JOptionPane.showMessageDialog(null, "Apartment not found");
    return null;
}

すぐに返される値のローカル変数を宣言する必要はありません。また、メッセージダイアログは、ループが終了した後にのみ表示される必要があります。これは、その場合にのみ、検索されている番号のアパートがないことが確実になるためです。

問題のコードに関しては、その通りです。変数はループのchosenに宣言されている必要があるため、ループので参照できます。あなたがそれを宣言した方法では、それはブロックの内側にのみ表示されます。forif

于 2012-04-25T04:20:21.607 に答える
0

あなたは正しいです。あなたは間違った場所で選ばれたと宣言しました。ループの直前に宣言しますが、(そこに)nullを割り当てます。そうすれば、リターンラインに到達したときに値を持つことが保証されます。

または、1つのアパートだけが一致すると仮定すると(または、どちらのアパートも気にしない)、return x;if...trueの場合に単純に入れることができます。そして、ループが完了したと仮定して、ループの後にnullを返します。また、ループしているため、一致しないすべてのアパートに「見つかりません」というメッセージが表示されます。あなたはおそらく、アパートを見つけることなくループが完了した後にそれを表示したいだけです。

于 2012-04-25T04:17:09.893 に答える
0

コード内の変数chosenは、それが作成されたスコープ内にトラップされていたため、の外部では使用できませんでした{}。また、残りのforループが実行される前に、ifステートメントのelseブランチがトリガーされていました。

選択したアパートを実際に保存する必要はありません。次のように、すぐに返却できます。

public static Apartment getApartment(String aNumber)
{   
    for (Apartment apartment : listOfApartments) 
    {   
        if (apartment.getApartmentNo().equalsIgnoreCase(aNumber))
            return x;
    }  
    JOptionPane.showMessageDialog(null, "Apartment not found");
    return null;
} 
于 2012-04-25T04:17:12.107 に答える
0

次のように、forループの前に変数'chosen'を宣言します。

Apartment chosen = new Apartment();

また、探しているアパートを見つけたら、forループから抜け出すことができます。リストが大きい場合は、時間を節約できる可能性があります。

于 2012-04-25T04:18:04.743 に答える
0

受け入れられた答えは正しいですが、複数の return ステートメントを避けることを強くお勧めします。複数の return ステートメントを含むコードは、管理が難しくなります。まだ大したことではないように思えるかもしれませんが、コードが大きくなると、これは実際の問題になる可能性があります。

public static Apartment getApartment(String aNumber)
{   
    Apartment result = null;
    for (Apartment apartment : listOfApartments) 
    {   
        if (apartment.getApartmentNo().equalsIgnoreCase(aNumber))
        {
             result = apartment;
             break;
        }
    }  
    if (result == null)
    {
        JOptionPane.showMessageDialog(null, "Apartment not found");
    }
    return result;
} 
于 2012-04-25T08:10:37.890 に答える
0

関数によって返される変数chosenはここでは範囲外です。ループが始まる直前のメソッドの開始時に宣言してください。

于 2012-04-25T07:59:43.093 に答える