【问题标题】:How to replace multiple if-else statements to optimize code?如何替换多个 if-else 语句来优化代码?
【发布时间】: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",你是否只“调用第一个函数”?

标签: java if-statement optimization contains


【解决方案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 是最好的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2013-08-08
      • 2017-12-12
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多