我有2个ArrayList。 ArrayList A
具有8.1k个元素,而ArrayList B
具有81k个元素。Java通过两个数组搜索
我需要遍历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,然后将其放回列表中 – Richard