0

現在のプロジェクトでは、Javaで次のデータ構造を実装しました。

Map<List<String>, Set<Subscriber>> regionSubscriber 
= new Hashtable<List<String>, Set<Subscriber>>();

上記のデータ構造に対して以下の操作を実装したいと思います。

1)キーがこのマップに存在するかどうかを確認します(と同様containsKey(Key))。2)キーリスト付きのセットを取得します(と同様get(key))。

containskey(Key)とのようなMapのデフォルト機能を試してみましget(Key)た。ただし、ここではキーがリスト(単一のオブジェクトではない)であるため、これらは機能していません。

運用の実施について教えてください。わかりやすくするために詳細が必要な場合はお知らせください。


更新:次のequals()関数とhashCode()関数を作成しました。これらの機能をご確認ください。彼らは働いていません。これらの機能の修正。

public boolean equals(Object obj){
        boolean booleanFlag = false;
        List<String> regionID = (List<String>) obj;
        for(int i=0; i< regionID.size() ; i++) {
            if ( regionID.get(i).equals(this.regionIDs.get(i)) ){
                booleanFlag = true;             
            } else {
                booleanFlag = false;
            }           
        }       
        return booleanFlag;     
    }



@Override
    public int hashCode() {
        int hashValue = 0;
        for(int i=0; i< regionIDs.size(); i++) {
            hashValue = hashValue + regionIDs.get(i).hashCode();
        }               
            return hashValue;
    }
4

2 に答える 2

2

リストはキーとして機能しますが、完全に一致するものを提供する必要があることに注意する必要があります。つまり、equals()であり、同じhashCode()を持ち、同じ順序であるリストの要素を提供する必要があります。

注:キーとして使用された後は、キーを変更することはできません。たとえば、リストをキーとして追加してから変更しても、マップが引き続き機能することを期待することはできません。

于 2012-06-29T11:41:06.203 に答える
1

containsKey関数とget関数をマップで正常に機能させるには、キーとして使用されるオブジェクトのクラスがhashCodeメソッドとequalsメソッドを実装する必要があります。

あなたがする必要があるのは、あなたがキーとして使用するリストタイプをサブクラス化することです。

public class MyList extends ArrayList() {
    //constructors


    public boolean equals(Object obj) {
        // a good equals implementation
    }

    public int hashCode() {
        // a good hashcode implementation
    }
}

equalsメソッドとhashCodeメソッドを実装して機能させる方法については、次のリンクを参照してください 。JavaでequalsメソッドとhashCodeをオーバーライドする場合、どのような問題を考慮する必要がありますか。

于 2012-06-29T11:40:37.083 に答える