web-dev-qa-db-ja.com

javaのスイッチケースで文字列を使用します

循環的な複雑さを改善するために、ifを確認しながら、次のswitchcase-Stringに変更する必要があります。

String value = some methodx;
if ("Apple".equals(value)) {
    method1;
}

if ("carrot".equals(value)) {
    method2;
}

if ("mango".equals(value)) {
    method3;
}

if ("orange".equals(value)) {
    method4;
}

しかし、どの値を取得するのかわかりません。

57
randeepsp

Java(バージョン7より前)は、switch/caseのStringをサポートしていません。ただし、enumを使用して目的の結果を得ることができます。

private enum Fruit {
    Apple, carrot, mango, orange;
}

String value; // assume input
Fruit fruit = Fruit.valueOf(value); // surround with try/catch

switch(fruit) {
    case Apple:
        method1;
        break;
    case carrot:
        method2;
        break;
    // etc...
}
165
nickdos

誰もが少なくとも Java 7 を使用していますよね?元の問題に対する答えは次のとおりです。

String myString = getFruitString();

switch (myString) {

    case "Apple":
        method1();
        break;

    case "carrot":
        method2();
        break;

    case "mango":
        method3();
        break;

    case "orange":
        method4();
        break;
}

  • Caseステートメントは、String.equalsを使用するのと同等です。
  • 通常、文字列の照合では大文字と小文字が区別されます。
  • docs によれば、これは一般に、チェーンのif-elseステートメントを使用するよりも高速です( cHaoの答え のように)。
18
Suragch

elseの使用方法を学びます。

valueが一度に2つの異なる文字列と等しくなることはないため、考えられる結果ごとに1つと、「上記のどれでもない」ための結果が5つしかありません。しかし、コードはパスできないテストを排除しないため、16の「可能な」パス(2 ^テストの数)があり、そのほとんどは決して追跡されません。

elseを使用すると、実際に発生する可能性のある5つのパスのみが存在します。

String value = some methodx;
if ("Apple".equals(value )) {
    method1;
}
else if ("carrot".equals(value )) {
    method2;
}
else if ("mango".equals(value )) {
    method3;
}
else if ("orance".equals(value )) {
    method4;
}

または、switchステートメントで文字列を使用する機能を含むJDK 7の使用を開始します。もちろん、Javaは、switchをコンパイルしてif/elseのようなコンストラクトを作成します...

17
cHao

循環的な複雑さを軽減するには、マップを使用します。

Map<String,Callable<Object>> map = new HashMap < > ( ) ;
map . put ( "Apple" , new Callable<Object> () { public Object call ( method1 ( ) ; return null ; } ) ;
...
map . get ( x ) . call ( ) ;

または多型

5
emory

具体的なエモリーの答えを作るために、実行可能コードは次のとおりです。

  Map<String,Callable<USer>> map = new HashMap<String,Callable<User>>();
  map.put( "test" , new Callable<User> () { public User call (){ return fillUser("test" ); }} ) ;
  map.put( "admin" , new Callable<Utente> () { public Utente call (){  return fillUser("admin" ); }} ) ;

ここで、ユーザーはPOJOであり、

  User user = map.get(USERNAME).call();

最後にcalledメソッドがどこかにあります:

 private User fillUser(String x){        
        User user = new User();
        // set something in User
        return user;
}
1
m.piunti
    String name,lname;
 name= JOptionPane.showInputDialog(null,"Enter your name");
   lname= JOptionPane.showInputDialog(null,"Enter your father name");
    if(name.equals("Ahmad")){
       JOptionPane.showMessageDialog(null,"welcome "+name);
    }
    if(lname.equals("Khan"))
   JOptionPane.showMessageDialog(null,"Name : "+name +"\nLast name :"+lname ); 

    else {
       JOptionPane.showMessageDialog(null,"try again " );
    } 
  }}
0
latifa

Switchは、int、short、Shor、byte、Byte、int、Integer、char、Character、またはenum型と互換性のあるデータ型にのみ適用できます。

0
omar

これは、1.7より前の方法として考えられますが、推奨できません。

public class PoorSwitch
{
    final static public int poorHash (String s) {
        long l = 0L;
        for (char c: s.toCharArray ()) {
            l = 97*l + c;
        }
        return (int) l;
    }

    public static void main (String args[])
    {
        String param = "foo";
        if (args.length == 1)
        {
            param = args[0];
        }
        // uncomment these lines, to evaluate your hash
        // test ("foo");
        // test ("bar");
        switch (poorHash (param)) {
            // this doesn't work, since you need a literal constant
            // so we have to evaluate our hash beforehand:
            // case poorHash ("foo"): {
            case 970596: {
                System.out.println ("Foo!");
                break;
            }
            // case poorHash ("bar"): {
            case 931605: {
                System.out.println ("Bar!");
                break;
            }
            default: {
                System.out.println ("unknown\t" + param);
                break;
            }
        }
    }

    public static void test (String s)
    {
        System.out.println ("Hash:\t " + s + " =\t" + poorHash (s));
    }
}

おそらく、生成されたコードでこのようなトリックを使用できます。そうでなければ、私はそれをお勧めできません。ハッシュ衝突の可能性が心配するほどではありませんが、何かが混ざり合っている場合(カットアンドペースト)、エラーを見つけるのは困難です。 931605は適切なドキュメントではありません。

コンセプトの証明として、好奇心としてそれを取る。

0
user unknown

Switchステートメントを使用したString変数の評価は Java SE 7 で実装されているため、Java 7.でのみ機能します。また、この新しい方法を見ることができます 機能 はJDK 7で実装されています。

Java 8は文字列スイッチケースをサポートしています。

String type = "Apple";

switch(type){
    case "Apple":
       //statements
    break;
    default:
       //statements
    break; }
0
Yash

Javaは、Stringを使用したSwitch-caseをサポートしていません。 this リンクが役立つと思います。 :)

0
Sunmit Girme