Я ищу способ узнать, идентичны ли два набора разных типов элементов, если я могу указать взаимное отношение между этими типами элементов. Есть ли стандартный способ сделать это в java или, возможно, в guava или apache?Сравните два набора типов differrent
Вот моя собственная реализация этой задачи. Например, у меня есть два класса элементов, которые я знаю, как сравнивать. Для простоты, я сравниваю их поле ID:
class ValueObject {
public int id;
public ValueObject(int id) { this.id=id; }
public static ValueObject of(int id) { return new ValueObject(id); }
}
class DTO {
public int id;
public DTO(int id) { this.id=id; }
public static DTO of(int id) { return new DTO(id); }
}
Тогда я определить интерфейс, который делает при сравнении
interface TwoTypesComparator<L,R> {
boolean areIdentical(L left, R right);
}
и фактический метод сравнения наборов выглядит как этот
public static <L,R> boolean areIdentical(Set<L> left, Set<R> right, TwoTypesComparator<L,R> comparator) {
if (left.size() != right.size()) return false;
boolean found;
for (L l : left) {
found = false;
for (R r : right) {
if (comparator.areIdentical(l, r)) {
found = true; break;
}
}
if (!found) return false;
}
return true;
}
Пример кода клиента
HashSet<ValueObject> valueObjects = new HashSet<ValueObject>();
valueObjects.add(ValueObject.of(1));
valueObjects.add(ValueObject.of(2));
valueObjects.add(ValueObject.of(3));
HashSet<DTO> dtos = new HashSet<DTO>();
dtos.add(DTO.of(1));
dtos.add(DTO.of(2));
dtos.add(DTO.of(34));
System.out.println(areIdentical(valueObjects, dtos, new TwoTypesComparator<ValueObject, DTO>() {
@Override
public boolean areIdentical(ValueObject left, DTO right) {
return left.id == right.id;
}
}));
Я ищу стандартное решение этой задачи. Или любые предложения по улучшению этого кода приветствуются.
Наборы на самом деле очень легко и быстро сравнивать, но только тогда, когда они одного типа. – Kayaman
Если бы они действительно были, в Гуаве не было [так много вспомогательных методов] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ Sets.html). Не то, чтобы я против вашего слова, но «Set» явно страдает от недостатка мыслей, когда он впервые был разработан в Java 1.2. –
Ну, большинство этих методов имеют форму 'newXXXSet', которую я бы подсчитал. Затем подсчитайте те, которые возвращают неизменяемые представления, и на самом деле у вас нет таких методов, которые обеспечивали бы несуществующие функции. – Kayaman