Заявление о проблемах
У меня есть две коллекции того же типа объектов, которые я хочу сравнить. В этом случае я хочу сравнить их на основе атрибута, который не учитывается в 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.
}
}
Я хочу сравнить две коллекции, чтобы утверждать, что для позиции i
в каждой коллекции weightedRank
каждого имени в этой позиции имеет одно и то же значение. Я сделал некоторый Googling, но не нашел подходящего метода в 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;
}
Вопрос
Есть ли другой способ сделать это? Я пропустил очевидный метод из Коллекций Commons?
Связанные
Я также заметил этот вопрос на SO, который похож, хотя в этом случае я думаю, что переопределение equals()
имеет немного больше смысла.
Изменить
Что-то очень похожее на то, что в ближайшее время (на момент написания этой статьи) будет выпущен Apache Commons Collections, См. https://issues.apache.org/jira/browse/COLLECTIONS-446.