2012-03-24 18 views
-2

クラスを作成して、そのクラス内で文字列xを受け取り、受け取った文字列がString []内のStringのいずれかと一致するかどうかをループで調べます。ここに私のコードです:文字列を入力し、文字列が配列内の任意の文字列と一致するかどうかを確認する(JAVA)

public class MatchCountry 
{ 
    public boolean findCountry(String a) 
    { 
    boolean match = false; 
    String [] euCountries = {"Albania", "Andorra", "Armenia", "Austria", "Azerbaijan", "Belarus", "Belgium", "Bosnia and Herzegovina", 
     "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Denmark", "Estonia", "Finland", "France", "Georgia", "Germany", "Greece", 
     "Holland", "Iceland", "Ireland", "Italy", "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", "Macedonia", "Malta", 
     "Moldova", "Monaco", "Montenegro", "Netherlands", "Norway", "Poland", "Portugal", "Romania","Russia","San Marino", 
     "Serbia", "Slovakia", "Slovenia", "Spain", "Sweden", "Switzerland", "Turkey", "Ukraine", "United Kingdom", "Vatican City"}; 
    int l = euCountries.length; 

    for (int i = 0; i < l; i++) 
    { 
     System.out.println(euCountries[i]); 
     if (a == euCountries[i]) 
     match = true; 
     else 
     match = false; 
    } 
    return match; 
    } 

    public static void main (String args[]) 
    { 
    MatchCountry mc = new MatchCountry(); 
    boolean found = mc.findCountry("Portugal"); 
    System.out.println(found); 
    } 
} 

この作品ではありませんか?ブール値が見つかった場合はI出力、それは代わりに、これの

答えて

4

...私はFALSE与え続け:

if (a == euCountries[i]) 
    match = true; 
    else 
    match = false; 

この置く:と

if (a.equals(euCountries[i])) { 
    match = true; 
    } 

問題をあなたのifた:

  • 文字列が等しくない場合はmatch = falseでした。検索する国があなたのリストの最後でない限り、
  • 文字列を.equalsメソッドと比較する必要があります。それ以外の場合は、文字列参照ではなく文字列参照を比較します。
+0

まだ動作しません:S –

+0

申し訳ありませんが動作します。ありがとうございました。それはうまくいきませんでした。 –

+0

クールで、喜んで助けてください! –

2

Java文字列は参照型であり、==を使用して比較すると、これらの参照の値が比較されます。 2つの文字列がの同じオブジェクトでない限り、比較はfalseを返します。

a == euCountries[i]ではなくeuCountries[i].equals(a)をお試しください。 String.equalsは、参照ではなく値で比較されます。 (私が.equalsを使用している落とし穴のために比較を逆にした:もしがヌルポインタ例外を投げるなら、aはヌルポインタ例外をスローするでしょう、そしてequalsはfalseを返します)

あなたはできるだけ早くあなたではなく、アレイ全体を通じてたびにループするよりも、試合を見つけたように終了、ということにすれば

for (int i = 0; i < l; i++) { 
    if (euCountries[i].equals(a)) { 
     return true; 
    } 
} 
return false; 

のように言って、物事はもう少し効率的に作ることができます。あなたはあなたが何をするにしても、else { match = false; }を取り除きたいと思うでしょう - あなたの配列の最後の国を除いて問題を引き起こすでしょう。

また、配列ではなくHashSetを使用することを検討することもできます。配列の各要素を比較するよりも、文字列がハッシュコードでセットに含まれているかどうかをチェックする方がはるかに効率的です。あなたがそうするならば、それは静的で機能の外にしたいと思うでしょう。

0

これを試してみてください:

for (int i = 0; i < l; i++) 
{ 
    if (a.equals(euCountries[i])) { 
     return true; 
    } 
} 
return false; 

それはあなたが一致するものを見つけるとすぐに終了するには、より効率的です。なぜ見続けるの?代わりに、配列内の国を保存する、この方法をリストに入れて、それを確認してください:ここで

はそれはそれは単純になるかもしれない試して別のことだ

return (euCountries.contains(a)); 
1

ベストセットの実装を使用することです例えばHashSet。 しかし、セットを使用しない理由がある場合でも、あなたのコードは、これまでのすべての

最適まずからで、クラスに純粋な定数データを入れる(静的)

private static final String [] euCountries = {"Albania", "Andorra", "Armenia", "Austria", "Azerbaijan", "Belarus", "Belgium", "Bosnia and Herzegovina", 
    "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Denmark", "Estonia", "Finland", "France", "Georgia", "Germany", "Greece", 
    "Holland", "Iceland", "Ireland", "Italy", "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", "Macedonia", "Malta", 
    "Moldova", "Monaco", "Montenegro", "Netherlands", "Norway", "Poland", "Portugal", "Romania","Russia","San Marino", 
    "Serbia", "Slovakia", "Slovenia", "Spain", "Sweden", "Switzerland", "Turkey", "Ukraine", "United Kingdom", "Vatican City"}; 

、このバージョンは、はるかにあります効率的な、余分なVARない、データが順序付けされているので、あなたが停止するとき

public boolean findCountry(String a) 
{ 
    for (String country : euCountries) { 
    int res = country.compareTo (a); // or use compareToIgnoreCase when more appropriate 
    if (res == 0) return true; 
    if (res > 0) return false; 
    } 
    return false; 
} 

次の最適化ステップは、yの場合は、バイナリ検索

1

を構築することです知っています私たちの国別コードの配列は適切にソートされていますが、java.lang.Arrays.binarySearchを使用しないと、ループする手間が省け、標準JREの一部ですか?私はそれに匹敵するケースでいつも使っています。

関連する問題