【问题标题】:retainAll in java is very slow... Is there a method which is faster?java中的retainAll非常慢......有没有更快的方法?
【发布时间】:2015-03-23 08:57:59
【问题描述】:

我有一个大学项目是«创建一个比较两个文本的双语词典(第二个是第一个的翻译)。

有 3 个文本长度来测试我们的程序。小号的输出不到 1 秒,中号的 45 秒,大号的大约 85 分钟。

NetBeans 说最长的方法是 ArrayList 上的 «retainAll»。有没有更快的方法?

编辑:一小段代码,我必须检查每个单词/翻译的相关索引。

double ens1= list2.size();
double ens2=test.size();
//intersection of the both list
list2.retainAll(test);
//size of the intersection
double long_fin=list2.size();
//correlation index
correlation=(long_fin/(Math.sqrt(ens1*ens2)));

【问题讨论】:

  • 请显示一些代码。另外,我猜你用错了 DS,如果你想经常搜索,使用 Set 或 Map

标签: java performance arraylist


【解决方案1】:

使用Set 代替List。这大大消除了复杂性。

或者,您可以对两个列表进行排序,并在一个循环中实现全部保留。

(附加评论:使用 int 而不是 double - 这让我们安全打字的开发人员感到紧张。)

【讨论】:

  • 感谢您的回答!我的两个列表都已经排序了,所以我使用了一个自定义的 retainAll(带有二进制搜索),它确实更有效。
  • 使用集合真的很有帮助。很多!我用集合替换了几个列表,这减少了在 2 个列表上调用 retainAll 所需的时间,每个列表大约有 500.000 个整数,从 15 分钟缩短到 8 秒。
  • @BjørnStenfeldt 谢谢,实际的统计数据确实会说话。从二次复杂度到线性复杂度等等。我们 Java 程序员经常陷入每个集合看起来都像 List 的陷阱。
猜你喜欢
  • 2015-04-25
  • 2014-04-14
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多