如何替换多个 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 语句来优化代码?的主要内容,如果未能解决你的问题,请参考以下文章

C# 之 if-else代码优化

可以一学的代码优化小技巧:减少if-else冗余

可以一学的代码优化小技巧:减少if-else冗余

可以一学的代码优化小技巧:减少if-else冗余

if-else代码优化,优雅点好不

优化if-else代码的八种方案!