Java で Collections Framework を使用するだけで、あなたが探していると思われるものの概算を作成しました。率直に言って、@Mike Deckが指摘しているように、おそらくやり過ぎだと思います。比較して処理するアイテムのこのような小さなセットの場合、手続き上の観点からは配列の方が適していると思いますが、これが私の疑似コード化された (私は怠け者なので) ソリューションです。Foo クラスは、コンテンツ内のすべてのデータではなく、一意の ID に基づいて比較できると仮定しています。
Collection<Foo> oldSet = ...;
Collection<Foo> newSet = ...;
private Collection difference(Collection a, Collection b) {
Collection result = a.clone();
result.removeAll(b)
return result;
}
private Collection intersection(Collection a, Collection b) {
Collection result = a.clone();
result.retainAll(b)
return result;
}
public doWork() {
// if foo is in(*) oldSet but not newSet, call doRemove(foo)
Collection removed = difference(oldSet, newSet);
if (!removed.isEmpty()) {
loop removed {
Foo foo = removedIter.next();
doRemove(foo);
}
}
//else if foo is not in oldSet but in newSet, call doAdd(foo)
Collection added = difference(newSet, oldSet);
if (!added.isEmpty()) {
loop added {
Foo foo = addedIter.next();
doAdd(foo);
}
}
// else if foo is in both collections but modified, call doUpdate(oldFoo, newFoo)
Collection matched = intersection(oldSet, newSet);
Comparator comp = new Comparator() {
int compare(Object o1, Object o2) {
Foo f1, f2;
if (o1 instanceof Foo) f1 = (Foo)o1;
if (o2 instanceof Foo) f2 = (Foo)o2;
return f1.activated == f2.activated ? f1.startdate.compareTo(f2.startdate) == 0 ? ... : f1.startdate.compareTo(f2.startdate) : f1.activated ? 1 : 0;
}
boolean equals(Object o) {
// equal to this Comparator..not used
}
}
loop matched {
Foo foo = matchedIter.next();
Foo oldFoo = oldSet.get(foo);
Foo newFoo = newSet.get(foo);
if (comp.compareTo(oldFoo, newFoo ) != 0) {
doUpdate(oldFoo, newFoo);
} else {
//else if !foo.activated && foo.startDate >= now, call doStart(foo)
if (!foo.activated && foo.startDate >= now) doStart(foo);
// else if foo.activated && foo.endDate <= now, call doEnd(foo)
if (foo.activated && foo.endDate <= now) doEnd(foo);
}
}
}
あなたの質問に関する限り: ID をキーにして oldSet と newSet を HashMap (ここでは順序は関係ありません) に変換すると、コードが読みやすくなり、比較しやすくなりますか? 変換時に失われる時間とメモリのパフォーマンスはどれくらいですか? おそらく Map を使用してコードを読みやすくすると思いますが、おそらく変換中により多くのメモリと時間を使用するでしょう。
2 つのセットを反復して適切な操作を実行すると、より効率的かつ簡潔になりますか? はい、特に@Mike Sharekのアドバイスに従って、独自のリストを特殊な方法でローリングするか、ビジターデザインパターンのようなものに従ってコレクションを実行し、各アイテムを処理する場合、これは両方の世界で最高です。