2

当您有很长的 IfElse 时,其中哪一种是最好的方法?

        if (text.contains("text"))
        {
            // do the thing
        }
        else if (text.contains("foo"))
        {
            // do the thing
        }
        else if (text.contains("bar"))
        {
            // do the thing
        }else ...

或者

        if (text.contains("text") || text.contains("foo") || ...)
        {
            // do the thing
        }

或许

        Pattern pattern = Pattern.compile("(text)|(foo)|(bar)|...");
        Matcher matcher = pattern.matcher(text);
        if(matcher.find())
        {
            // do the thing
        }

我的意思是只有当你必须检查很多这些时。谢谢!

4

3 回答 3

4

我个人会使用一个集合,因为我认为它更容易阅读并且contains在 O(1) 中会很有效:

Set<String> keywords = new HashSet<String>();
keywords.add("text");
keywords.add("foo");
keywords.add("bar");

if(keywords.contains(text)) {
    //do your thing
}

如果你喜欢它紧凑,你也可以写:

Set<String> keywords = new HashSet<String>(Arrays.asList("text", "foo", "bar"));

if(keywords.contains(text)) {
    //do your thing
}

最后,如果您总是使用相同的列表,您可以创建关键字private static final而不是每次运行该方法时都重新创建它。

编辑
在评论之后,上面的内容确实等同于使用条件 with text.equals("xxx"), not text.contains("xxx")。如果您真的打算使用包含,那么您将不得不遍历集合并测试每个字符串,但它变成了 O(n) 操作:

for (String key : keywords) {
    if (text.contains(key)) {
        //do your stuff
        break;
    }
}
于 2012-04-16T12:57:09.553 回答
0
String[] storage = {
    "text",
    "foo",
    "bar",
    "more text"
};

for(int i=0; i < storage.length(); i++){
    //Do Something
}

这有帮助吗?

于 2012-04-16T12:56:30.083 回答
0

通常长If else语句被语句替换case,但这并不总是可能的。如果我在哪里推荐,我会选择第二个选项,选项 1 会给你一堆If else if else做同样事情的语句,而对于第三种情况,正则表达式往往会很快增长得相当大。

再次取决于有多少alot,最好将所有字符串放入数据结构中并对其进行迭代以查看元素是否在其中。

于 2012-04-16T12:58:35.653 回答