我的目标是在大约 500000 个对象及更多对象的列表中查找重复项。但应该可以在运行时定义重复项是什么。简单地说,应该可以通过这些对象的一组(更改的)用户定义字段来查找重复项。
我的方法
- 为每个字段创建一个装饰器类
- 覆盖 equal 和 hash 方法
- 创建所需的对象(可能只是字段颜色、高度、颜色、高度、宽度、重量)
- 查找重复项(不是这里的问题)
但是这是一个好方法吗?我的感觉是太多的样板。还有更简单的吗?
限制:无 SQL。
最佳答案
我又考虑了这个问题,所以我想我应该把我的评论建议变成一个实际的答案。
我只会创建一个 BiPredicate<T, T>
它与请求的字段(在运行时)有关,并将返回 true
如果它们在这些字段上相等,并且 false
否则。
例如,假设您有以下类型:
public class YourType {
private final String name;
private final int age;
private final int hatSize;
// Constructors and getters omitted...
}
并且您想要查找重复项而忽略 hatSize
,那么你可以这样写:
public BiPredicate<YourType, YourType> makeChecker(
final Collection<Function<YourType, ?>> fieldGetters) {
// 'first' and 'second' are the two 'YourType' instances
// to be compared
return (first, second) -> {
// Iterate over all the field getters
for (final Function<YourType, ?> fieldGetter : fieldGetters) {
// Retrieve the field values from each object
final Object firstsField = fieldGetter.apply(first);
final Object secondsField = fieldGetter.apply(second);
// If they're not equal, break early
if (!Objects.equals(firstsField, secondsField)) {
return false;
}
}
// All of the requested properties were equal
return true;
};
}
并使用类似以下内容调用它:
makeChecker(Arrays.asList(YourType::getName, YourType::getAge));
然后,您可以在集合中执行任何正常的“删除重复项”方法,使用返回的 BiPredicate
来比较它们。的test
方法。
关于java - 通过用户定义的字段集查找重复对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60224514/