【问题标题】:compare two generic complex objects java比较两个通用复杂对象java
【发布时间】:2012-04-26 12:14:06
【问题描述】:

我的要求是比较相同未知/通用类型的两个对象。 对象很复杂。它们可以包含列表,而列表本身可以包含列表。

所以,我最初的想法是使用 Comparator 来比较对象,反射 用于发现 bean 的所有属性和一些递归来处理任何嵌套 列出对象可能包含的内容。

或者,是否有一个实用程序可以在 java 中为我完成所有这些工作?

【问题讨论】:

  • 如果是 2 个不同的对象,并且您不知道它们的类型,您会根据什么标准比较它们?
  • @ClementHerreman:这也是我的第一个想法。但问题是“比较两个相同未知/通用类型的对象”
  • 嗨,还没有真正考虑过。让我们假设有一个预定义的可能类型列表,字符串、整数、日期、列表 - 包含相同的类型。然后我可以在对每种类型进行比较之前使用 instanceOf 检查。
  • 我相信这被称为“深度比较”。

标签: java generics reflection compare


【解决方案1】:

如果您可以确保所有嵌套对象树都实现 Comparable,您可以使用:

 public int compareTo(Object o) {
   return CompareToBuilder.reflectionCompare(this, o);
 }

http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html

【讨论】:

    【解决方案2】:

    你可以使用Bean Utils或者直接使用...Apache Commons EqualsBuilder

    类似的solution

    已编辑: 请查看this post。谷歌搜索后,我还发现了this BeanDiff api,这可能对你有用。

    【讨论】:

    • 我认为这大致是我正在寻找的,但我有一个额外的要求。我需要抛出一个异常并报告哪些属性不相等,而不是只返回一个布尔值来表示是/否对象相等。所以,我想我需要实现类似于 EqualsBuilder 的东西,当对象不相等并报告相同时抛出异常。
    • 一旦遇到两个对象之间的差异,像 EqualsBuilder 这样的 api 就不会进行更深的遍历。您可能需要考虑其他 api 或采用您自己的方法。
    【解决方案3】:

    我目前正在处理类似的问题。我可以确认使用 java 反射可以比较相同未知/通用类型的两个对象。我找到了我需要做的一切here。以下是有关如何执行此操作的简要说明:

    1. 在一个函数中获取两个对象
    2. 确定 ob1 的所有字段
    3. 假设对象的类型相同,您可以使用 one 字段从两个对象中获取值并进行比较,例如 field.get(ob1).equals(field.get(ob2)

    但是,比较对象内部的对象要困难得多。我还没有找到解决方案,这就是问题所在:要与使用反射的项目进行比较,您需要两个对象。我还没有找到一种从未知类型的对象中提取对象的方法。如果你发现了什么,请告诉我。

    【讨论】:

      【解决方案4】:

      母羊。我想您可以使用反射来获取字段列表,然后从那里开始。您将需要一些复杂的代码来确定给定字段是简单类型还是复杂类型,并在比较时深入了解复杂的字段。

      See this 让您开始获取字段列表、字段名称和类型

      【讨论】:

        【解决方案5】:

        我会按照你已经提到的那样做。

        1. 检查两个对象是否属于同一类型和
        2. 遍历对象 1 的所有变量
          1. 获取对象2中变量的值
          2. 调用 valueOfVariableInObject1.compareTo(valueOfVariableInObject2)

        【讨论】:

          【解决方案6】:

          免责声明:我不是 JAVA 开发人员。

          我认为没有一种比较未知类型的干净方法。这是我要做的:声明一个接口,我们称之为 ComparableInterface

          interface ComparableInterface {
              function isEqual(ComparableInterface $a);
          }
          

          让你的未知对象可能成为实例的所有类都实现这个接口。然后用它来比较它们。

          我能想到的任何其他解决方案都是丑陋的 hack :/.另外我认为如果你必须比较你不知道的想法,你的设计就有问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-14
            • 1970-01-01
            • 2013-04-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多