在java中使用switch in case

Use string in switch case in java

我需要将下面的if改为switchcase,同时检查String以提高圈复杂度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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之前)不支持String/Case中的字符串。但您可以通过使用枚举来获得所需的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,对吧?以下是原始问题的答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String myString = getFruitString();

switch (myString) {

    case"apple":
        method1();
        break;

    case"carrot":
        method2();
        break;

    case"mango":
        method3();
        break;

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

笔记

  • 案例陈述相当于使用String.equals
  • 和往常一样,字符串匹配区分大小写。
  • 根据文件,这通常比使用链接的if-else语句(如曹的回答)要快。


学习使用else

因为value永远不会同时等于两个不相等的字符串,所以只有5种可能的结果——一种是你关心的每个值,另一种是"以上都不是"。但是,因为您的代码没有消除那些无法通过的测试,所以它有16条"可能"路径(测试数量的2%),其中大部分永远不会被遵循。

使用else时,唯一存在的路径是可以实际发生的5条路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}

或者开始使用JDK7,它包括在switch语句中使用字符串的能力。当然,Java将编译EDCOX1,3,EDCX1,5,EDCX1,0,类似的构造…


要降低圈复杂度,请使用地图:

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

或多态性


为了给出具体的emory答案,可执行代码如下:

1
2
3
  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,然后

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

最后,调用的方法是:

1
2
3
4
5
 private User fillUser(String x){        
        User user = new User();
        // set something in User
        return user;
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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 +"
Last name :"
+lname );

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


Java 8支持String交换盒。

1
2
3
4
5
6
7
8
9
String type ="apple";

switch(type){
    case"apple":
       //statements
    break;
    default:
       //statements
    break; }


在JavaSE 7中实现了用开关语句来评估EDCOX1×7变量,因此它只在Java 7中工作。您还可以看看这个新特性是如何在JDK7中实现的。


我们可以只在数据类型兼容的int上应用开关:short、shor、byte、byte、int、integer、char、character或enum类型。


以下是一种可能的1.7之前版本的方法,我不推荐:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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不支持带字符串的切换实例。我想这个链接可以帮助你。:)


不是很漂亮,但这里有另一种方法:

1
2
3
4
5
6
7
8
String runFct =
        queryType.equals("eq") ?"method1":
        queryType.equals("L_L")?"method2":
        queryType.equals("L_R")?"method3":
        queryType.equals("L_LR")?"method4":
           "method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String value = someMethod();
switch(0) {
default:
    if ("apple".equals(value)) {
        method1();
        break;
    }
    if ("carrot".equals(value)) {
        method2();
        break;
    }
    if ("mango".equals(value)) {
        method3();
        break;
    }
    if ("orance".equals(value)) {
        method4();
        break;
    }
}