【问题标题】:Most efficient way to check string array and then write it into file检查字符串数组然后将其写入文件的最有效方法
【发布时间】:2019-07-09 15:00:45
【问题描述】:

我需要检查StringsList 是否包含某些预定义字符串,并且 - 如果所有这些预定义字符串都包含在列表中 - 我需要将列表写入文件。

作为第一种方法,我想这样做

if(doesTheListContainPredefinedStrings(list))
    writeListIntoFile(list);

doesTheListContainPredefinedStringswriteListIntoFile 执行循环以分别检查 prefefinedStrings 并将列表的每个元素写入文件。

但是 - 因为在这种情况下我必须担心性能 - 我想利用这样一个事实,即在 doesTheListContainPredefinedStrings 方法中,我仍在评估列表中的元素一次。

我也想过

String[] predefinedStrings = {...};

...

PrintWriter pw = new FileWriter("fileName");

int predefinedStringsFound = 0;

for (String string : list)
{
    if (predefinedStrings.contains(string))
        predefinedStringsFound++;

    pw.println(string);
}

if (predefinedStringsFound == predefinedStrings.length)
    pw.close();

因为我观察到 - 至少在我正在开发的系统(Ubuntu 19.04)上 - 如果我不关闭流,则字符串不会写入文件。 尽管如此,这个解决方案似乎真的很糟糕,并且仍然会创建文件,所以 - 如果列表无法通过检查 - 无论如何我都会遇到删除它的问题(这需要再次访问存储)。

有人可以建议我更好/最好的方法,并解释为什么它对我更好/最好?

【问题讨论】:

  • 你应该考虑成功的概率。如果在大多数情况下,所有预定义的字符串都在列​​表中,那么您的第二个解决方案似乎是有效的。如果没有,您将失去性能,因为您正在对磁盘进行大量不必要的(缓慢)写入,在这种情况下,第一个选项更好 imo。
  • 假设您在 @Conffusion 的消息中属于“通常成功”类别,您始终可以将文件写入临时目录(由您的操作系统自动清理的目录)和在成功的情况下执行Files.move(假设临时目录与您的另一台机器位于同一驱动器上,这应该很好且快速),并在失败的情况下将其保留在那里。保存您直接删除。

标签: java list file


【解决方案1】:

检查相反的情况 - strings-to-check-list 中 predefs 中的任何字符串是否丢失?

Collection<String> predefs;  // Your certain predefined strings
List<String> list;           // Your list of strings to check

if( ! predefs.parallelStream().anyMatch( s -> ! list.contains( s ) ) )
  writeListIntoFile(list);

只要在要检查的字符串列表中找不到来自 predefs 的第一个字符串,上述 lambda 表达式就会停止并返回 true — 在这种情况下,您不能写入文件。
它不检查字符串检查列表中是否有任何其他字符串,这些字符串不包含在 predefs 字符串中。

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 2011-06-28
    • 2012-08-06
    • 2023-04-04
    • 1970-01-01
    • 2019-07-24
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多