1

私は2つのリストを持っています:

List x = [1, 2, 5, 7, 8];
List y = [1, 3, 4, 5];

次の計算された非対称の違いを取得しようとしています。

x - y (what's in x that's not in y) => 2 7 8
y - x (what's in y that's not in x) => 3 4

私はすでにこれこれに関するいくつかのポインタをチェックしましたが、私は背中にいくつかの制約があります:

  1. 私が実装しようとしているのは、Java 1.4に固執していることを除いて、guavaのSets.differenceが提供するものとまったく同じです(実装をリストからセットに簡単に変更できます)

  2. これらのメソッドはインプレースで機能するため、Collection.removeAll/retainAllを使用すると取引が中断されます。私がリストに保持しているオブジェクトは、実際にはHibernateにマップされている重いPOJOSです。

  3. この意味で、この計算はすでにそれらのPOJOSに実装されているため、ハッシュベースの実装で機能するものが必要です。

結論として、Java 1.4用のSetsユーティリティクラスのようなものはありますか?または、2つのコレクションの非対称差を計算できるものはありますか?

4

1 に答える 1

5

短いリストの場合はインプレースでの作業で問題ない場合がありますが、数百の要素がある場合は、への変換HashSetが高速になるはずです。しかし、スピードはあなたの問題ですか?あなたはそれについて言及しませんでしたが、そうでなければ、あなたが必要とするすべてはあなたの古いバージョンでさえJDKによって提供されます。あなたの目標がわからないので、複数のオプションを提案しています。

xに含まれるすべてのものから削除する場合は、またはyのいずれx.removeAll(y)かを実行しますx.removeAll(new HashSet(y))。前者は短いリストの場合は高速で、後者は長いリストの場合は高速です。

変更したくない場合はx、コピーを作成することをお勧めします。Guavaの方法でビューを作成することは可能ですが、コレクションを直接操作するよりも作業が多く、ビューの操作は遅くなります(特に、大きなListsを操作する場合は遅いためcontains)。

x両方とy他のリストの要素から同時に削除する場合は、次のようにしますHashSet xx = new HashSet(x), yy = HashSet(y); x.removeAll(y); y.removeAll(x);

新しいコレクションを作成することにより、オブジェクトはコピーされず、古いオブジェクトへの新しい参照のみが作成されることに注意してください。

于 2012-10-08T22:10:13.670 に答える