循環的な複雑さを改善するために、if
を確認しながら、次のswitch
をcase
-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;
}
しかし、どの値を取得するのかわかりません。
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...
}
誰もが少なくとも Java 7 を使用していますよね?元の問題に対する答えは次のとおりです。
String myString = getFruitString();
switch (myString) {
case "Apple":
method1();
break;
case "carrot":
method2();
break;
case "mango":
method3();
break;
case "orange":
method4();
break;
}
注
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
のようなコンストラクトを作成します...
循環的な複雑さを軽減するには、マップを使用します。
Map<String,Callable<Object>> map = new HashMap < > ( ) ;
map . put ( "Apple" , new Callable<Object> () { public Object call ( method1 ( ) ; return null ; } ) ;
...
map . get ( x ) . call ( ) ;
または多型
具体的なエモリーの答えを作るために、実行可能コードは次のとおりです。
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;
}
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 " );
}
}}
Switchは、int、short、Shor、byte、Byte、int、Integer、char、Character、またはenum型と互換性のあるデータ型にのみ適用できます。
これは、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は適切なドキュメントではありません。
コンセプトの証明として、好奇心としてそれを取る。
Java 8は文字列スイッチケースをサポートしています。
String type = "Apple";
switch(type){
case "Apple":
//statements
break;
default:
//statements
break; }
Javaは、Stringを使用したSwitch-caseをサポートしていません。 this リンクが役立つと思います。 :)