2013-06-26 53 views
-1

要比較同一類的不同對象及其內容(如jobTitleId,classificationId,deptId &),將在稍後使用Set和Map進行操作。我能夠通過重寫Object類的equals和hashCode方法來實現這一點,並能夠獲取信息(如下圖所示)。使用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等)可動態地與他們的價值拉。所以,就我的理解而言,我使用了兩個類(TableClass和ColWithData),使得ColWithData的List在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; 

編輯我一直在下降投票。所以,我再次對我的要求做了一些修改。 (請幫我解決這個問題)

+0

你實際上想要達到的目標很不清楚。也許可以非常清楚地告訴我們你正在努力解決的具體問題,以及你如何解決問題的全過程。那麼也許我們可以將您的代碼指向正確的方向。就目前而言,我所看到的只是一大堆沒有實現的方法,而這些方法似乎與您的問題無關 - 無論如何。 –

+0

你不能使用Map 來代替「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值,但你也許應該。

還有就是迷惑我在你的代碼的另一件事:

爲什麼使用getter/setter方法,如果你的財產(cwdList)是public

+0

感謝Eric通過簡單地使用Map解決了這個問題。爲了使數據抓取得心應手,我使用了getter/setter。是的,但我想getter/setter主要用於注入對象。請讓我知道更多關於getter/setter。 – Sanchit

+0

您使用getter/setter來避免直接訪問屬性。這就是爲什麼在大多數情況下,屬性字段被設置爲「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>>(); 

根據需要顯示的東西。