2013-12-04 2 views
0

У меня есть классКак сравнить данные двух одинаковых объектов в Java

  MyData 

и его объект

   myData 

В этом классе MyData .. есть несколько полей

как

  int id 

      String name 

      String desc 

и т.д ..

Теперь у меня есть два объекта этого класса ..

Можно проверить, что если данные этих двух объектов все же, как и оба объекта имеют одинаковый идентификатор, то же самое имя, так же Desc. .. Не проверяя каждое поле этого объекта .. (т.е. без проверки id, name, desc каждого объекта). Поскольку есть десятки полей этого объекта.

Я использую JAVA с GWT

Некоторые реализации я наткнулся .. Не уверен, если это какая-то вещь, возможно .valid

private static String oldSequence = ""; 

    boolean changed(TestSequence sequence) { 
     String newSequence = serializeToString(sequence); 
     boolean changed = !newSequence.equals(oldSequence); 
     oldSequence = newSequence; 
     return changed; 


    } 

    private static byte[] serialize(Object obj) throws IOException { 
     ByteArrayOutputStream b = new ByteArrayOutputStream(); 
     ObjectOutputStream o = new ObjectOutputStream(b); 
     o.writeObject(obj); 
     return b.toByteArray(); 
    } 

    private static String serializeToString(Object obj) { 
     try { 
      return new String(serialize(obj)); 
     } catch (Exception ex) { 
      return "" + ex; 
     } 
    } 

Благодаря

+1

ваша правка полностью изменил вопрос, лучше бы спросил другой вопрос. – hevi

ответ

0

No.

Вы должны переопределить метод equals() и сравнить объекты в этом.

0

Переопределите метод equals объекта в MyData и проверьте поля самостоятельно.

6

Вы должны переопределить hashCode() и equals() метод. вы можете сгенерировать их из IDE.

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof MyData)) return false; 

    MyData myData = (MyData) o; 

    if (id != myData.id) return false; 
    if (!desc.equals(myData.desc)) return false; 
    if (!name.equals(myData.name)) return false; 

    return true; 
} 

@Override 
public int hashCode() { 
    int result = id; 
    result = 31 * result + name.hashCode(); 
    result = 31 * result + desc.hashCode(); 
    return result; 
} 

Теперь вы можете сравнить объекты. Вот и все.

+0

+1 хорошее объяснение –

+0

Это не безопасная реализация. что, если и строк ничтожно! – hevi

+0

@hevi Если кто-то хочет сравнить пустой объект здесь.вы можете использовать некоторую проверку. Кстати, в чем причина сравнения пустого объекта здесь? –

1

GWT не имеет значения для вашего требования.

Прямого пути нет.

Вы должны определить свое равенство, чтобы проверить, насколько они равны или нет. Это переопределение равно() способ.

@Override 
public boolean equals(Object obj) { ... 

Перед выполнением: Right way to implement equals contract

0

Переопределение hashCode() и equals() методы

хэш-код()

Этот метод обеспечивает имеет код объекта.

В основном реализация по умолчанию hashCode(), предоставляемая объектом, выводится путем сопоставления адреса памяти с целым значением.Если посмотреть на источник класса Object, вы найдете следующий код для hashCode.

public native int hashCode(); 

Это указывает на то, что hashCode является собственной реализации, который обеспечивает адрес памяти в определенной степени. Однако в вашем классе реализации можно переопределить метод hashCode.

равно()

Этот метод используется, чтобы сделать равное сравнение между двумя объектами. В Java существует два типа сравнений. Один использует оператор «= =», а другой - «equals()». Надеюсь, вы знаете разницу между этими двумя. Более конкретно, .equals() относится к отношениям эквивалентности. Поэтому в широком смысле вы говорите, что два объекта эквивалентны, они удовлетворяют условию equals().

0

Сериализовать ваши объекты и сравнить их результаты!

Вы просто должны быть мудрыми в выборе вашего метода сериализации.

+0

Можете привести небольшой пример этого: – junaidp

+0

http://stackoverflow.com/questions/35785/xml-serialization-in-java – RGO

3

Обычный способ заключается в переопределении equals и hashCode методов. Стандартные библиотеки Java, например Map s, List s, Set s используют функции equals и hashCode для тестирования равенства. Код ниже также не нулевой;

Вот код вашего дела;

public class MyData { 
    int id; 

    String name; 

    String desc; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     MyData myData = (MyData) o; 

     if (id != myData.id) return false; 
     if (desc != null ? !desc.equals(myData.desc) : myData.desc != null) return false; 
     if (name != null ? !name.equals(myData.name) : myData.name != null) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = id; 
     result = 31 * result + (name != null ? name.hashCode() : 0); 
     result = 31 * result + (desc != null ? desc.hashCode() : 0); 
     return result; 
    } 
} 

и вы можете проверить равенство;

.... 
Mydata d1 = new... 
Mydata d2 = new... 
boolean areTheyEqual = d1.equals(d2); 

Однако, если вы не можете сделать сравнение поле за полем, то вы можете использовать массивы байтов, нет никакой необходимости, чтобы преобразовать их в строки.

..... 
    public boolean equals(Object other){ 
     if (this == other) return true; 
     if (other == null || getClass() != other.getClass()) return false; 
     byte[] bytesThis = serialize(this); 
     byte[] bytesOther = serialize(other); 
     if(bytesOther.length != bytesThis.length) return false; 
     return Arrays.equals(bytesThis, bytesOther); 
    } 

    public static byte[] serialize(Object obj) throws IOException { 
     ByteArrayOutputStream b = new ByteArrayOutputStream(); 
     ObjectOutputStream o = new ObjectOutputStream(b); 
     o.writeObject(obj); 
     return b.toByteArray(); 
    } 
    ... 
1

Как и все остальные говорит, вы должны переопределить equals() и hashCode() методы.

Обратите внимание, что вам не нужно это делать вручную. В Eclipse вы можете просто нажать на Source/generate hashCode() and equals(), и он сделает вашу работу за вас. Я уверен, что другие IDE тоже имеют такую ​​же особенность.

1

Если вы не хотите добавлять дополнительный код при добавлении нового поля, вы можете попробовать выполнить итерацию по полям.

Вы сказали «Without checking each and every field of this object ..(i.e without checking the id,name,desc of Each object myself)», я не мог понять, не хотите ли вы проверять каждое поле для равенства или не хотите ЗАПИСАТЬ проверку для каждого поля для равенства. Я предположил, что последний, поскольку вы пытались добавить метод сравнения равенства, используя выборочные проверки.

В любом случае следует проверить код для каждого поля. Вы можете скопировать/вставить любой объект. Если в будущем вам понадобятся некоторые поля, а некоторые нет, вы можете использовать annotations.

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MyData myData = (MyData) o; 

    Field[] fields = this.getClass().getDeclaredFields(); 
    for(Field field:fields){ 
     Object o1 = null; 
     Object o2 = null; 
     try { 
      o1 = field.get(this); 
      o2 = field.get(o); 
     } catch (IllegalAccessException e) { 
      return false; 
     } 
     if(o1 == null && o2 != null) return false; 
     if(o2 == null && o1 != null) return false; 
     if(o2 == null && o1 == null) continue; 

     if(!o2.equals(o1)) return false; 
    } 

    return true; 

}

+0

Это реализация частично верна; подумайте о том, что еще один класс, полученный из этого класса, с некоторыми дополнительными полями, в этом случае он будет работать неправильно :) – hevi

+0

+1, хороший, хотя! – hevi

Смежные вопросы