java - 通过用户定义的字段集查找重复对象

标签 java

我的目标是在大约 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/

相关文章:

java - 使用 LWUIT IO 和 J2me 库发出 http 请求时出现异常

java - Spring MVC Controller 测试 - 打印结果 JSON 字符串

通过 DSN 的 Java MySql 连接

java - 渐变 : Couldn't determine java version from '11.0.1'

java - J2SE 和 Java DB

java - 使用cameltestsupport进行Camel单元测试,模板始终为空

java - GWT DefaultLocalizedNames 使用当前区域设置

java - Juice 注入(inject)器抛出空指针异常

java - 如果我退出有计时器的 Activity ,就会将其关闭

java - ByteBuffer 分配和 allocateDirect