【发布时间】:2017-08-08 03:53:57
【问题描述】:
我有 2 个 ArrayList。 ArrayList A 有 8.1k 个元素,ArrayList B 有 81k 个元素。
我需要遍历B,在A 中搜索该特定项目,然后更改列表B 中匹配元素中的字段。
这是我的代码:
private void mapAtoB(List<A> aList, ListIterator<B> it) {
AtomicInteger i = new AtomicInteger(-1);
while(it.hasNext()) {
System.out.print(i.incrementAndGet() + ", ");
B b = it.next();
aList.stream().filter(a -> b.equalsB(a)).forEach(a -> {
b.setId(String.valueOf(a.getRedirectId()));
it.set(b);
});
}
System.out.println();
}
public class B {
public boolean equalsB(A a) {
if (a == null) return false;
if (this.getFullURL().contains(a.getFirstName())) return true;
return false;
}
}
但这需要永远。要完成此方法,大约需要 15 分钟。有什么办法可以优化这些吗? 15 分钟的运行时间太长了。
【问题讨论】:
-
使用索引,卢克!
-
我将从删除 System.out.print 和 println 调用开始。这很可能是大部分时间。您还应该告诉 b.equalsB(a) 做了什么(即发布代码):您可以使用 HashMap,并将复杂度降低到 O(m) 而不是 O(m*n)。并删除 it.set(b),它自己替换 b,因此是不必要的。此外,由于每个匹配的 a 都会替换 B 中由先前匹配的 A 设置的 ID,因此您可以向后迭代,并在找到匹配项后立即停止循环。
-
@JBNizet 我确实发布了 b.equalsB(a) 的代码。它就在第一种方法的正下方。并且 B 需要设置,因为我们正在更改 id 然后将其放回列表中
-
Bs中的URL长什么样子?它们看起来都一样吗?你能解析它们并从中提取“名字”部分吗?
-
@JBNizet 它们各不相同,因此很难进行标准解析
标签: java algorithm performance arraylist