2012-04-16 232 views
2

当你有很长的IfElse时,哪一种方法可以做到这一点?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 
     } 

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

回答

0

通常长Ifelse语句与case语句代替,但这并非总是可行。如果我在哪里推荐,我会选择第二个选项,选项1会给你一大堆If else if else陈述,它们可以做同样的事情,而对于第三种情况,正则表达式往往会相当快地增长很多。

再次取决于alot是多少,最好是将所有字符串放在数据结构中并遍历它以查看元素是否在其中。

0
String[] storage = { 
    "text", 
    "foo", 
    "bar", 
    "more text" 
}; 

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

这有帮助吗?

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而不是每次运行该方法时重新创建它。

编辑
继评论,这是事实,什么是自主相当于使用条件与text.equals("xxx"),不text.contains("xxx")。如果你真的想用的包含,那么你将不得不遍历集合和测试每个字符串,但它成为一个为O(n)操作:

for (String key : keywords) { 
    if (text.contains(key)) { 
     //do your stuff 
     break; 
    } 
} 
+0

我认为它实际上是O(log n),因为一个集合在内部存储为二叉树。尽管如此,HashTable具有O(1)的摊销效率。 – 2012-04-16 13:01:20

+1

从javadoc:“这个类为基本操作(添加,删除,包含和大小)提供了恒定的时间性能,假设散列函数在桶之间正确地分散元素。” - 对于字符串应该是这种情况。 – assylias 2012-04-16 13:02:02

+0

我的不好。我把它们与C++集混淆了,它们“通常作为二叉查找树实现”。 – 2012-04-16 13:06:34