0

将同一类的不同对象与其内容(如 jobTitleId、classificationId、deptId 和 classificationId)进行比较,稍后使用 Set 和 Map 进行一些操作。我可以通过简单地覆盖 Object 类的 equals 和 hashCode 方法来做到这一点,并且能够获取信息(如下面的地图中所示)。

Map<LocationData, List<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),这样 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;

编辑我被否决了。因此,我再次对我的要求进行了一些修改。(请帮我解决这个问题)

4

2 回答 2

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如果您的属性 ( ) 是,为什么要使用 getter/setter public

于 2013-06-27T08:33:01.310 回答
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>>();

根据需要显示的东西。

于 2013-06-26T17:05:25.250 回答