4

インスタンスが異なる2つのオブジェクトの違いを見つける必要があるJavaプログラムを書きたいと思います。equals() とコンパレーターを使用して実装しました。しかし、ここでは違いを見つけたいので、それをログ形式で表示する必要があります。

私のプログラムは以下です:

public class A implements Comparator<A>{

private int id1, id2;

/* setters and getters for id1 and id2 */

     public boolean equals(Object arg0) {
    if (this.getClass() != arg0.getClass()) {
        return false;
        }

        if (((A) arg0).getId1() == this.id1 && ((A) arg0).getId2() == this.id2) {
        return true;
        }

        return false;
     }

 public static void main(String args[]) {

    A obj1 = new A();
    obj1.id1 = 10;
    obj1.id2 = 20;

    A obj2 = new A();
    obj2.id1 = 30;
    obj2.id2 = 20;

    /*
     * equals comparison
     */

    if (obj1.equals(obj2)) {
        System.out.println("EQUALS");
    } else {
        System.out.println("NOT EQUALS");
    }

}

違いを見つけてログ形式で表示する方法を教えてください。

ありがとう。

4

5 に答える 5

2

実装Comparator<A>するには、メソッドが必要ですpublic int compare(A o1, A o2)。これはそのような実装の例です:

@Override
public int compare(A o1, A o2) {
    if (o1 == o2) {
        return 0;
    } else if (o1 == null) {
        return -1;
    } else if (o2 == null) {
        return 1;
    }
    if (o1.getId1() != o2.getId1()) {
        return o1.getId1() - o2.getId1();
    } else {
        return o1.getId2() - o2.getId2();
    }
}

次に、次のように使用できます。

    if (obj1.compare(obj1, obj2) == 0) {
        System.out.println("EQUALS");
    } else {
        System.out.println("NOT EQUALS");
    }

this をそれ自体Comparator<A>に入れるのではなく、別のクラスに を実装させる方がおそらく一般的です。A

于 2012-07-06T06:47:29.477 に答える
1

JavaReflectionを使用して、すべての比較プロパティのゲッターを持つ 2 つの同じタイプの Bean を比較できます。

public static void compareBeans(Object bean1, Object bean2, String... propertyNames)
          throws IntrospectionException,
          IllegalAccessException, InvocationTargetException {
        Set<String> names = new HashSet<String>(Arrays
            .asList(propertyNames));
        BeanInfo beanInfo = Introspector.getBeanInfo(bean1
            .getClass());
        for (PropertyDescriptor prop : beanInfo
            .getPropertyDescriptors()) {
          if (names.remove(prop.getName())) {
            Method getter = prop.getReadMethod();
            Object value1 = getter.invoke(bean1);
            Object value2 = getter.invoke(bean2);
            if (value1 == value2
                || (value1 != null && value1.equals(value2))) {
              continue;
            }

            System.out.println("Property = "+prop.getName() +" Value of been1 ="+value1 +" : Value of bean2 ="+value2);
          }
        }
      }

使用法:

Student2 つのプロパティを持つクラスの 2 つの Bean を比較するnameage

BeanComparator.compareBeans(new Student("Amita", 21), new Student("Amit", 23) , props);

出力:

Property = age Value of been1 =21 : Value of bean2 =23
Property = name Value of been1 =Amita : Value of bean2 =Amit
于 2012-07-06T07:37:13.447 に答える
0

メソッドを変更して、equals各プロパティを比較できます。比較を行うたびに、結果をログに記録します。そのようなものはうまくいくはずです:

@Override
public boolean equals(Object arg0) {
    if (this.getClass() != arg0.getClass()) {
        return false;
    }

    boolean same = true;
    //LOG: Comparing ((A) arg0).getId1() with this.id1
    if (((A) arg0).getId1() == this.id1) {
        //LOG: Property Id1 is the same for both: Value of Id1 = this.id1        
    }
    else {
        //LOG: Property Id1 is not the same. Source Id1 = ((A) arg0).getId1() , target Id1 = this.id1
        same = false;
    }

    if (((A) arg0).getId2() == this.id2) {
        //LOG: Property Id2 is the same for both: Value of Id2 = this.id2        
    }

    else {
        //LOG: Property Id2 is not the same. Source Id2 = (((A) arg0).getId2(), target Id2 = this.id2
        same = false;
    }

    //
    return same;
}

編集:自分のコンパレーターと言うときの意味が正確にはわかりません。自分で比較したい場合は、次のようにすることができます。

public boolean areTheSame(Object arg1, Object arg2)
{
    if (arg1.getClass() != arg0.getClass()) {
        return false;
    }

    boolean same = true;
    //LOG: Comparing ((A) arg0).getId1() with arg1.id1
    if (((A) arg0).getId1() == arg1.id1) {
        //LOG: Property Id1 is the same for both: Value of Id1 = arg1.id1        
    }
    else {
        //LOG: Property Id1 is not the same. Source Id1 = ((A) arg0).getId1() , target Id1 = arg1.id1
        same = false;
    }

    if (((A) arg0).getId2() == arg1.id2) {
        //LOG: Property Id2 is the same for both: Value of Id2 = this.id2        
    }

    else {
        //LOG: Property Id2 is not the same. Source Id2 = (((A) arg0).getId2(), target Id2 = arg1.id2
        same = false;
    }

    //
    return same;
}

これをメイン クラスでスローして、次の行の代わりに呼び出すことができます。

if (obj1.equals(obj2)) {
    System.out.println("EQUALS");
} else {
    System.out.println("NOT EQUALS");
}

したがって、次のようにします。

if (areTheSame(obj1, obj2)) 
{
    System.out.println("They are equal");
}
else
{
    System.out.println("They are not equal");
}
于 2012-07-06T06:03:23.737 に答える
0

Apache Commons EqualsBuilderequals()を使用してメソッドを生成できます

与えられたクラス:

public class Person {
    private long id;
    private String firstName;
    private String lastName;
}

equals メソッドは次のようになります

public boolean equals(Object object) {
    if (!(object instanceof Person)) {
        return false;
    }
    Person rhs = (Person) object;
    return new EqualsBuilder()
        .appendSuper(super.equals(object))
        .append(firstName, rhs.firstName)
        .append(lastName, rhs.lastName)
        .isEquals();
}

または、リフレクションを使用してこれを行う場合

public boolean equals(Object o) {
   return EqualsBuilder.reflectionEquals(this, o);
}
于 2013-07-29T08:52:07.860 に答える
0

オープン ソース ツールの javas - https://github.com/javers/javersを使用できます。Javars では、return Diff を持つメソッド compare(Object one, Object another) を見つけることができます。差分には変更のリストが含まれています (参照の追加、プロパティの変更など)。

于 2014-04-05T13:15:44.780 に答える