我想知道是否有任何方法可以优化此代码。
String[] array;
for(String s:array){
if(s.contains("one"))
//call first function
else if(s.contains("two"))
//call second function
...and so on
}
字符串基本上是我从文件中读取的行。因此可以有很多行。我必须在这些行中查找特定的关键字并调用相应的函数。
答案 0 :(得分:4)
这不会阻止您编写代码来执行许多String#contains
次调用,但是,它会避免if/else
链接..
您可以创建一个键功能映射,然后迭代此映射的条目以查找要调用的方法。
public void one() {...}
public void two() {...}
private final Map<String, Runnable> lookup = new HashMap<String, Runnable>() {{
put("one", this::one);
put("two", this::two);
}};
然后您可以遍历条目集:
for(final String s : array) {
for(final Map.Entry<String, Runnable> entry : lookup) {
if (s.contains(entry.getKey())) {
entry.getValue().run();
break;
}
}
}
答案 1 :(得分:1)
你可以使用开关,但在这种情况下我认为if else是最好的方式
答案 2 :(得分:1)
由于您声明检查的顺序并不重要,您可以使用正则表达式匹配和switch
的组合:
static final Pattern KEYWORDS=Pattern.compile("one|two|tree|etc");
Matcher m=KEYWORDS.matcher("");
for(String s:array) {
if(m.reset(s).find()) switch(m.group()) {
case "one": //call first function
break;
case "two": //call second function
break;
case "three": //call third function
break;
case "etc": // etc
break;
}
}
由于这将在第一场比赛时停止,无论哪个关键字,对于包含接近开头的匹配项的字符串,它可能比检查一个又一个关键字更有效。