有没有办法将开关与String.contains(“”)集成?

时间:2014-01-21 10:16:33

标签: java switch-statement

我需要检查一个String对象是否包含()各种子串并根据结果执行不同的代码片段。目前我有一系列的其他如果。如果可能的话我想把它转换成一个开关。有没有办法做到这一点?

目前:

 if (SomeString.contains("someSubString")) {

    . . . do something

 } else if (SomeString.contains("anotherSubString")) {

    . . . do something else

 } else if (SomeString.contains("yetanotherSubString")) {

    . . . do something even more different

 }  
 .
 .
 .

4 个答案:

答案 0 :(得分:16)

当我遇到这样的情况,并且真的不想使用else if时,我会这样做:

String[] cases = {"someSubString", "anotherSubString", "yetanotherSubString"};

int i;
for(i = 0; i < cases.length; i++)
    if(SomeString.contains(cases[i])) break;

switch(i) {
    case 0: //someSubString
        System.out.println("do something");
    break;
    case 1: //anotherSubString
        System.out.println("do something else");
    break;
    case 2: //yetanotherSubString
        System.out.println("do something even more different");
    break;
    default:
        System.out.println("do nothing");
}

当然,这有几个缺点。对于初学者来说,如果你在除了结尾之外的任何地方添加另一个字符串,所有索引都会移动,你必须手动纠正。尽管如此,我认为我已经使用了一两次这样的东西,并认为它使代码更具可读性。据推测,这些指数在程序中具有一定的含义,因此将0...someSubString以一种对问题有意义的方式联系起来。

答案 1 :(得分:1)

你不能在交换机中使用String变量,但你可以使用char,也许你所有字符串中的特定字符不同?

对于“someSubString”,“anotherSubString”和“yetanotherSubString”,你可以使用类似的东西:

switch(SomeString.chatAt(0)) {
    case 's':
    case 'a':
    case 'y':
}

但只有当你知道字符串的所有可能值并且特定位置的字符在所有字符串上有所不同时,这才有效。

答案 2 :(得分:0)

在Java 7中,您可以打开完整的字符串,但不能打开部分外观。你可以做的是处理这种情况的策略模式。

private abstract class StringProcessor {
    String pattern;

    StringProcessor(String str) {
        pattern = str;
    }

    boolean matches(String str) {
        return str.matches(pattern);
    }

    abstract void process(String str);
}

StringProcessor[] processors = new StringProcessor[] {
    new StringProcessor("patt1") {
        void process(String str) {
            // do stuff for patt1
        }
    },
    new StringProcessor("patt2") {
        void process(String str) {
            // do stuff for patt2
        }
    }

};

然后在你的方法中:

for (StringProcessor sp: processors) {
    if (sp.matches(str)) {
        sp.process(str);
        break; // Don't break if you want the option to handle all that match
    }
}

现在,您可以根据需要添加任意数量的不同StringProcessors,并且将检查所有内容,如果匹配则将调用代码。在许多情况下,您可以提前预先定义处理器列表,但如果需要,您也可以动态创建它。

答案 3 :(得分:0)

对于我使用的相同类型的情况如下。 首先得到了我正在研究的所有字符串作为字符串

String str ="someSubString,anotherSubString,yetanotherSubString"

然后从上面的字符串

中获取列表

List items = Arrays.asList(str.split("\s*,\s*"));

现在循环上面的列表并使用包含和切换

<pre>
  for (String item : items) {
            if (mainStr.contains(item)) {
                switch (item) {
                    case "someSubString":
                        do something
                        break;
                    case "anotherSubString":
                        do something else
                        break;
                    case "yetanotherSubString":
                        do something even more different
                        break;
                }
            }
        }
</pre>

希望这会帮助那些现在正在寻找相同类型要求的人。