2013-06-26 2 views
-1

Чтобы сравнить разные объекты одного и того же класса с их содержимым, таким как jobTitleId, classicId, deptId & categoryId должно было быть сделано и сделать некоторые манипуляции позже с помощью Set and Map. Я смог сделать это, просто переопределив методы equals и hashCode класса Object и смог получить информацию (например, на следующей карте).Сравнение динамических полей объектов с использованием методов equals и hashCode

Map<LocationData, List<LocationData>> 

Ниже класс я использовал (его было показано, что вам так, что он может быть передан на моей постановке проблемы):

LocationData класс

package com.astreait.bulkloader; 

public class LocationData {  
    String locId, deptId, jobTitleId, classificationId; 

    @Override 
    public boolean equals(Object obj) {   
     LocationData ld = (LocationData)obj;   
     return this.deptId.equals(ld.deptId) && this.jobTitleId.equals(ld.jobTitleId) && this.classificationId.equals(ld.classificationId) && 
this.locId.equals(ld.locId);  
    } 

    @Override 
    public int hashCode() {   
     return deptId.hashCode() + jobTitleId.hashCode() + classificationId.hashCode() +locId.hashCode(); 
    } 
} 

Проблема:

Я уже знаю, для чего все поля этого объекта мне нужны для сравнения. то я обязан использовать переменные с именем ClassificationID, deptId, jobTitleId & locId т.д.

Потребность: Мне нужно настроить эту логику так, чтобы поля имен (ClassificationID, deptId, jobTitleId & locId и т.д.) могут быть динамически двигались вместе со своими значениями. Итак, насколько я понимаю, я использовал 2 класса (TableClass и ColWithData), так что List of ColWithData присутствует в объекте TableClass.

Я думаю, что если я переопределю те же самые методы equals() & hashCode(); , что то же самое можно достичь.

TableClass class #1 

class TableClass{ 
    List<ColWithData> cwdList; 

    @Override 
    public boolean equals(Object obj) { 
     boolean returnVal = false; 
       // I need to have the logic to be defined such that 
       // all of the dynamic fields can be compared 
     return returnVal; 
    } 

    @Override 
    public int hashCode() { 
     int returnVal = 0; 
       // I need to have the logic to be defined such that 
       // all of the dynamic fields can be found for their individual hashCodes 
     return returnVal; 
    } 
} 

класс ColWithData # 2

class ColWithData{ 

    String col; // here the jobTitleId, classificationId, deptId, locId or any other more fields info can come. 
    String data; // The corresponding data or value for each jobTitleId, classificationId, deptId, locId or any other more fields. 

} 

Пожалуйста, дай мне знать, если я иду в правильном направлении, или я должен сделать некоторые любой другой подход. Если нормально использовать текущий подход, то что должно быть выполнено в методах equals и hashCode?

Наконец мне нужно сделать карту как: (Его не беспокойство, как я буду делать, но может рассматриваться как мой желаемый результат от этой логики)

Map<TableClass, List<TableClass>> finalMap; 

EDIT я вниз проголосовали , Итак, я снова внес некоторые изменения в свои требования. (Пожалуйста, помогите мне решить это)

+0

Очень неясно, чего вы на самом деле пытаетесь достичь. Возможно, выложим для нас очень четко, какова конкретная проблема, которую вы пытаетесь решить, и ваш полный мыслительный процесс о том, как вы ее разрешите. Тогда, возможно, мы можем указать ваш код в правильном направлении. Как бы то ни было, все, что я вижу, это куча не-реализаций методов, которые, похоже, не имеют ничего общего с вашей проблемой - что бы это ни было. –

+0

Не можете ли вы использовать карту вместо списка «ColWithData»? Было бы намного проще реализовать 'equals()' и 'hashCode()', если бы вы могли перебирать ключи карты ... –

ответ

1

Использование этого класса ColWithData является своего рода уродливым.Вы должны использовать Map<String,String>:

package mypack; 

import java.util.*; 

public class TableClass { 
    /* HashMap containing your values: 
     map.put("locId", [data]); 
     ... 
    */ 
    public Map<String,String> cwdMap; 

    public Map<String,String> getCwdMap() { 
     return cwdMap; 
    } 

    public void setCwdMap(Map<String,String> cwdMap) { 
     this.cwdMap = cwdMap; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     TableClass tClass = (TableClass) obj; 

     for(String col: this.cwdMap.keyset()){ 
      if (! tClass.cwdMap.get(col).equals(this.cwdMap.get(col)){ 
       return false; 
      } 
     } 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int hCode = 0; 
     for(String col: this.cwdMap.keyset()){ 
      hCode = hCode+cwdMap.get(col).hashCode(); 
     } 

     return hCode; 
    } 
} 

В этом коде я никогда не проверить null значений, но ваш, вероятно, должно быть.

Существует еще одна вещь, которая запутать меня в вашем коде:

зачем использовать геттер/сеттер, если ваше имущество (cwdList) является public?

+0

Спасибо Эрик решил проблему, просто используя Map. Чтобы сделать выборку данных полезной, я использовал геттер/сеттер. Да, но я думаю, что геттер/сеттер в основном используется для инъекции объектов. Пожалуйста, дайте мне знать больше о геттере/сеттере. – Sanchit

+0

Вы используете геттер/сеттер, чтобы избежать прямого доступа к объекту. Вот почему в большинстве случаев поле свойства имеет значение 'private', что заставляет использовать getter/setter для доступа к нему вне класса. Но это просто выбор, который вы должны сделать сами. Я советую вам прочитать о POJO и getter/setter в любом месте в Интернете! –

0

Я думаю, что нашел решение и его работу для меня. Пожалуйста, дайте мне знать, может ли быть простой или любой другой способ найти решение этой проблемы.

Фрагмент кода:

package mypack; 

import java.util.*; 

public class TableClass { 
    public List<ColWithData> cwdList; 

    public List<ColWithData> getCwdList() { 
     return cwdList; 
    } 

    public void setCwdList(List<ColWithData> cwdList) { 
     this.cwdList = cwdList; 
    } 

    @Override 
    public boolean equals(Object obj) { 

     TableClass tClass = (TableClass) obj; 

     boolean returnVal = true; 



     for(ColWithData cwd: this.getCwdList()){ 
      for(ColWithData innerCwd: tClass.getCwdList()){ 
       if(cwd.getCol().equalsIgnoreCase(innerCwd.getCol())){ 
        if(!cwd.getData().equalsIgnoreCase(innerCwd.getData())) 
         returnVal = false; 
       } 
      } 
     } 

     return returnVal; 
    } 

    @Override 
    public int hashCode() { 
     int hCode = 0; 
     for(ColWithData cwd: this.getCwdList()){ 
      hCode = hCode+cwd.getData().hashCode(); 
     } 

     return hCode; 
    } 

} 

И, наконец, сделал карту, как сказал:

Map<TableClass, List<TableClass>> map = new LinkedHashMap<TableClass, List<TableClass>>(); 

отображения вещи, как хотелось бы.