コレクションの集合演算
コレクションの操作ってDBの操作に似ているよね、とどこかの記事で読んだ気がするのですがまったくその通りだと思います。
とするとJavaのCollectionフレームワークを使ってコレクション同士の集合演算、「和、積、差、排他和」などを求めてみたくなって来るのが人情。
と言うことで調べてみたら、Java5.0の標準ライブラリはついて来ないのですが、Jakarta Commons Collectionsに含まれてくるCollectionUtilsクラスのクラスメソッドにありました!
CollectionUtils.union(java.util.Collection a,java.util.Collection b) CollectionUtils.intersection(java.util.Collection a, java.util.Collection b) CollectionUtils.disjunction(java.util.Collection a, java.util.Collection b) CollectionUtils.subtract(java.util.Collection a, java.util.Collection b)
順番は適当ですが、それぞれコレクションの「和、積、差、排他和」を求めるためのメソッドです。
しかし、、微妙に痒いところに手が届かない、、このユーティリティ。。オブジェクト同士が同値であるかどうかを多分Object.equals()で求めていると思うのですが、できれば三番目の引数にComparatorなんかを渡すことができるようにして、
Listlist1 = ....; List list2 = ....; Comparator comparator = new HogeComparator(); List substracted = CollectionUtils.substract(list1,list2, comparator);
とかできるようにして欲しかった。
んで拡張できるかなあと参考にCollectionUtils.substract()のソースを見てみたのですが、
public static Collection subtract(final Collection a, final Collection b) { ArrayList list = new ArrayList( a ); for (Iterator it = b.iterator(); it.hasNext();) { list.remove(it.next()); } return list; }
なるほど、こりゃ無理だわ。