7

代替のハッシュコードと等値演算を使用できるようにする HashMap クラス (または Map インターフェイス) の実装はありますか? Collections.sort(リスト、コンパレータ)。

必要なハッシュコードとイコール演算を提供するキーラッパーを作成することは、できれば避けたいと思います。


私の場合、次のようなものが必要なシナリオの 1 つ:

私の Web アプリケーションでは、リクエストごとに、場所/ISP およびその他のデータを読み込みます。コードのさまざまな部分 (サービス層とリポジトリ層) で、その要件に固有のキャッシュを「最小化」しました。

簡単なコード例を次に示します。

class GeoIpData{
    private String countryName;
    private String state;
    private String city;
    private String isp;
    @Override
    public int hashCode() {
        //countryName hashCode
        //state hashCode
        //city hashCode
        //isp hashCode
    }
    @Override
    public boolean equals(Object obj) {
        // compare countryName
        // compare state
        // compare city
        // compare isp
    }
}

 Map<GeoIpData,#Type1> fullCache = ... //This cache needs to be unique per countryName,state,city and isp
 Map<GeoIpData,#Type2> countryCache = ... //This cache needs to be unique per countryName
 Map<GeoIpData,#Type2> ispCache = ... //This cache needs to be unique per countryName,isp

これを実現するには、上記の 3 つのマップに 3 つの異なる hashcode および equals メソッドが必要です。

fullCache:
hashCode -> GeoIpData.hashCode();
equals   -> GeoIpData.equals(Object obj);

countryCache:
hashCode -> {countryName hashCode }
equals   -> {compare countryName }

ispCache:
hashCode -> {countryName hashCode & isp hashCode }
equals   -> {compare countryName & compare isp hashCode }
4

2 に答える 2

8

GNU Troveを使用すると、特定の TObjectHashingStrategy に、TCustomHashMap の独自のハッシュ関数と等号関数を提供できます。

于 2013-03-03T10:23:40.460 に答える