問題文
比較したい同じタイプのオブジェクトのコレクションが2つあります。equals()
この場合、オブジェクトを考慮しない属性に基づいてそれらを比較したいと思います。私の例では、たとえば、ランク付けされた名前のコレクションを使用しています。
public class Name {
private String name;
private int weightedRank;
//getters & setters
@Override
public boolean equals(Object obj) {
return this.name.equals(obj.name); //Naive implementation just to show
//equals is based on the name field.
}
}
2つのコレクションを比較して、i
各コレクションの位置weightedRank
について、その位置の各名前の値が同じであることを確認したいと思います。グーグルを実行しましたが、Commons Collectionsやその他のAPIで適切なメソッドが見つからなかったため、次のことを思いつきました。
public <T> boolean comparatorEquals(Collection<T> col1, Collection<T> col2,
Comparator<T> c)
{
if (col1 == null)
return col2 == null;
if (col2 == null)
return false;
if (col1.size() != col2.size())
return false;
Iterator<T> i1 = col1.iterator(), i2 = col2.iterator();
while(i1.hasNext() && i2.hasNext()) {
if (c.compare(i1.next(), i2.next()) != 0) {
return false;
}
}
return true;
}
質問
これを行う別の方法はありますか?CommonsCollectionsからの明らかな方法を見逃しましたか?
関連している
私もSOでこの質問を見つけましたが、その場合はオーバーライドequals()
する方が少し理にかなっていると思います。
編集
これに非常によく似たものが、近い将来(この記事の執筆時点で)、ApacheCommonsCollectionsのリリースに入る予定です。https://issues.apache.org/jira/browse/COLLECTIONS-446を参照してください。