0

同じクラスのさまざまなオブジェクトを jobTitleId、classificationId、deptId、classificationId などのコンテンツと比較し、後で Set と Map を使用していくつかの操作を行う必要がありました。Object クラスの equals メソッドと hashCode メソッドをオーバーライドするだけで、これを行うことができ、情報を取得できました (次の Map のように)。

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 など) をその値とともに動的に取得できるように、このロジックをカスタマイズする必要があります。したがって、私の理解では、ColWithData のリストが TableClass オブジェクトに存在するように、2 つのクラス (TableClass と ColWithData) を使用しました。

equals() & hashCode(); 同じことが達成できるように同じ2つのメソッドをオーバーライドするとどうなるか考えています。

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 に答える