2つのArrayListがあります。 ArrayList A
には8.1k要素があり、ArrayList B
には81k要素があります。Java 2つの配列で検索する
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分の実行時間はあまりにも多くです。
インデックスを使用すると、Luke! –
私はSystem.out.printとprintln呼び出しを取り除くことから始めます。ほとんどの場合、これはほとんどの場合時間がかかります。また、b.equalsB(a)が何をしているか(つまりコードを投稿する)、HashMapを使用してO(m * n)ではなくO(m)に複雑さを減らすこともできます。 it.set(b)を削除します。これはbをそれ自体で置き換えるため不要です。また、一致したすべてのaが前の一致したAによって設定されたBのIDを置き換えるので、逆方向に反復して、一致を見つけたらすぐにループを停止することができます。 –
@JBNizet私はb.equalsB(a)のコードを投稿しました。最初の方法のすぐ下にあります。 IDを変更してリストに戻すのでBを設定する必要があります – Richard