【问题标题】:What is more efficient "||" or a loop?什么更高效“||”还是一个循环?
【发布时间】:2014-07-02 16:23:30
【问题描述】:

假设您必须从 arraylist("cat", "dog", "catdog", "mandog") 编辑一系列单词

现在您可以像这样将其放入 for 循环中

 for(int i=0; i<arraylist.size(); i++){
    if(arraylist.get(i).matches("cat") || arraylist.get(i).matches("dog") etc.. etc..
      {
        //do something
      }
   }

或者您可以将单词(cat、dog、catdog 和 mandog)放入字符串数组/arraylist 并使用它进行比较。

哪个效率更高?

考虑到单词列表可能非常大。

感谢您的帮助。

【问题讨论】:

  • 更高效的是将arrayList.get(i)操作从if中拉出来,所以它只被评估一次。
  • 我怀疑它会产生很大的不同。代码可读性在这里更重要:你不想要一个巨大的 if 语句,明确地将 .get(i) 与每个单词进行比较
  • 两者都不是。将单词放在一个集合中,看看arraylist.get(i)是否在集合中。
  • 另外,在不使用正则表达式时使用matches() 也不是最明智的做法。
  • 您想对这些字符串执行什么类型的操作?

标签: java if-statement for-loop performance


【解决方案1】:

两者都不会,性能差异可以忽略不计,它们在关键字列表的大小上都是线性的。

考虑到单词列表可能会变得非常大,您应该使用SetHashSet 可以在恒定时间内执行 contains 检查,非常适合此目的。所以:

Set<String> keywords = new HashSet<>();

keywords.add("cat");
keywords.add("dog");
// ...

for (String element: arraylist) {
    if (keywords.contains(element)) {
        // Do something
    }
}

请注意,使用matches 实际上与使用equals 相同,因此我们可以简单地测试是否相等。

【讨论】:

  • HashSet 是验证元素是否包含的最佳方法,并且它是在恒定时间内完成的。请注意, contains 方法区分大小写,如果您想与给定示例代码中的字符串“Cat”进行比较,它将不起作用,那么最好添加一个小写关键字并仅在小写模式下进行比较。
【解决方案2】:

我认为适当的方法(尽管需要做更多的工作)是测试所有选项。使用分析器查看代码执行查找所需的时间,然后继续执行产生最佳结果的过程。

不使用分析器,很难确定性能的改进。

【讨论】:

  • 并非总是如此。如果您可以为您需要的操作(例如 HashSet 与 ArrayList 进行包容)替换一个具有更好时间复杂度类的数据结构,那么您几乎肯定会引入性能改进。
  • @StefanoSanfilippo 是的,你是对的。这也是确保代码性能改进的好方法。但是,如果没有某种方法来衡量它,您仍然很难客观地确定改进代码的更改。
【解决方案3】:

由于您在代码中使用matches() 方法,我假设您需要对正则表达式进行匹配。如果是这种情况,您可以使用嵌套的 for 循环。

String[] patterns = {"cat", "dog"};
for(String item : arraylist){
    for(String pattern : patterns){
        if(item.matches(pattern)){
            //do something
        }
    }
}

如果您只想检查字符串是否存在于列表中,您可以使用 Stefano Sanfilippo 方法。

【讨论】:

  • 无需将patterns 数组包装在列表中,您也可以对数组进行迭代。
  • 是的。抱歉,这只是我常用的编码风格.. 已编辑.. :)
  • 如果数组列表和模式组都有很多条目,您可以通过编程方式(使用括号和|)将模式组合成一个模式,编译一次,然后匹配数组列表。但似乎“匹配”并不是真正必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2018-05-25
  • 2011-01-07
  • 2010-11-10
相关资源
最近更新 更多