AbstractSet.removeAll()には、修正済みとしてマークするコードが2つあります。概要異なる論理を設定する
AbstractSetは
public boolean removeAll(Collection<?> c) {
boolean modified = false;
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext();)
modified |= remove(i.next()); //1
} else {
for (Iterator<?> i = iterator(); i.hasNext();) {
if (c.contains(i.next())) {
i.remove(); //2
modified = true; //2
}
}
}
return modified;
}
は何秒(// 2)(// 1)第一としてmodified |= remove(i.next());
ではないことの背後にあるロジック可能性がありますか?
2番目の(// 2)は最初の(// 1)と同じになるように書き直して、余分なチェック(contains(i.next())
)がないようにします。
public boolean removeAll(Collection<?> c) {
boolean modified = false;
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext();)
modified |= remove(i.next()); //1
} else {
for (Iterator<?> i = iterator(); i.hasNext();) {
i.next();
modified |= i.remove()); //2
}
}
return modified;
}
アップデート1:無効i.remove()
戻ります。 Update2:i.remove()は、歓迎された結果でないセットを空にします。 update1、update2に基づいて、このリライトは機能しません。
'| ='ではなく、 '!='!重要な違い! –
リンクが壊れています。 –
@StephenCありがとうございます。リンクを修正しました:)! – Willmore