【问题标题】:Advantages of .contains() and splitting a string to compare?.contains() 和拆分字符串进行比较的优点?
【发布时间】:2015-02-14 23:32:53
【问题描述】:

我有一个大约 500 000 行的文件。每一行都有以下形式:'a date # content'。我想将日期与给定日期进行比较,我曾经将每一行 .split(' # ') 读入 String[] 并将日期与 if(lineString[0].equals(givenDate)){...} 进行比较。现在内容不包含日期,使用if(lineString.contains(givenDate)){...} 就足够了。那么有什么优势(运行时间、效率)或我应该知道的任何困难吗?

编辑: 感谢您的回答和解释。 .startsWith 似乎是最好的解决方案。

【问题讨论】:

  • 日期的格式是什么?
  • .contains() 效率更高,因为它可以提前退出,不需要额外的内存等。
  • split(" # ") 遍历整个字符串,然后将其复制到多个部分,这意味着您将每行遍历两次。 contains 方法只遍历字符串一次,所以应该更快。
  • @JeroenVannevel: .equals 将立即退出,因为如果字符串没有以正确的字符开头,它可以退出,而 .contains 将继续搜索日期直到行尾.
  • @CommuSoft:也就是说,如果您在真空中查看阵列中的单个条目。他仍然会遍历数组中的每一个条目。不过,当然:他们都以自己的方式提前退出。

标签: java arrays string split


【解决方案1】:

我认为最有效的方法是.startsWith。它只会将字符读取到时间格式的末尾,并且还会从一个字符不同的那一刻开始中断搜索。

为什么不.split

Split 遍历行到末尾,这是因为它旨在将字符串拆分为任意数量的部分,因此字符串末尾可能有一个#

为什么不.contains

同样的原因:它将继续尝试匹配字符串中的日期。此外,甚至有可能在文本中间某处存储了一个日期,在这种情况下,您甚至可以匹配技术上不正确的行。

例如 - 这里对格式做了一个小假设 - 如果该行显示:

20141231 # Scheduled an appointment with Tim on 20150115

然后搜索20150115 将得到匹配,虽然该行与该日期有关,但并未在该日期发布。

【讨论】:

  • startsWith() 绝对是最快的出手方式。
  • @CommuSoft 对我来说.startsWith 似乎是要走的路。非常感谢!
【解决方案2】:

split 使用 PatternMatcher behind the covers,但对于非常简单的情况(可能是您的情况)。对于任意正则表达式,如果您的拆分字符串是正则表达式,编译模式并将其重用于文件中的每个字符串通常会更有效。在您的情况下,我同意 startsWith 可能是最有效的。代码更紧凑,没有大量的内存分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 2013-11-30
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多