如何替换多个 if-else 语句来优化代码?
Posted
技术标签:
【中文标题】如何替换多个 if-else 语句来优化代码?【英文标题】:How to replace multiple if-else statements to optimize code? 【发布时间】:2017-02-27 20:07:00 【问题描述】:我想知道是否有任何方法可以优化此代码。
String[] array;
for(String s:array)
if(s.contains("one"))
//call first function
else if(s.contains("two"))
//call second function
...and so on
字符串基本上是我从文件中读取的行。所以可以有很多行。我必须在这些行中查找特定的关键字并调用相应的函数。
【问题讨论】:
您可以使用 Switch Case 来代替.. 没有其他可以帮助您!!! 在这种情况下如何切换案例帮助。?我有一个字符串行,我在其中检查子字符串。它不是“精确匹配”。 有哪些功能?所有人都有相同的签名吗? “优化”的意思是想让它跑得更快吗?您有性能问题吗? 这个订单是否依赖?例如,如果字符串是"this is two and one"
,你是否只“调用第一个函数”?
【参考方案1】:
这不会阻止您的代码执行许多 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 回答 这里没有理由使用TreeMap
,迭代HashMap
可能会更快,因为它基于平面数组。此外,没有理由仅仅为了节省输入lookup.
两次(或每个条目一次)而创建整个子类。 @Anurag:此代码不会遍历整个地图,它会在第一次匹配时停止,因此与您的原始 if … else if …
序列没有性能差异。
好吧,"one"
按字典顺序小于"two"
将是人为示例的属性,但如果TreeMap
施加的顺序与实际关键字的原始if … else if …
语句的程序顺序。如果需要维护查找顺序,使用LinkedHashMap
并输入所需的顺序将是更自然的选择。【参考方案2】:
由于您说检查的顺序并不重要,您可以使用正则表达式匹配和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;
由于这将在第一次匹配时停止,无论哪个关键字,对于包含接近开头的匹配项的字符串,它可能比一个接一个地检查关键字更有效。
【讨论】:
【参考方案3】:你可以使用 switch,但在这种情况下,我认为 if else 是最好的方法
【讨论】:
以上是关于如何替换多个 if-else 语句来优化代码?的主要内容,如果未能解决你的问题,请参考以下文章