2

これを適切に説明する方法についてはまだ確信が持てませんが、最善を尽くします。

マップのキーとして使用したい値を持つ一連のオブジェクトがあります。

探しているオブジェクトを取得するには、セットを反復処理して、内部の値を比較するだけです。オブジェクト内のこれらの値の 1 つがキーとして使用される可能性があることを考えると、これは非効率的です。問題は次のとおりです。オブジェクト内の値を変更すると、マップのキーも更新する必要があります。このタスクを容易にするデータ構造はありませんか?

本質的に; 内部の値が変化するとキーが変化する自動更新マップが欲しい...値の内部にマップを保存する必要がないので、確かに私の閉じた心よりも効率的な考え方がありますか?

自分の考えを理解するのに十分なほど自分自身を説明できたことを願っています。

4

2 に答える 2

0

私が正しく理解している場合は、次のコードを検討してください。

    public class Main{
        public static void main(String[] args) {
            Test test = new Test(5);
            Map<Test, String> map = new HashMap<Test, String>();
            map.put(test, "I'm here");
            test.value = 10;
            System.out.print(map.get(test));
        }

    }

    class Test{
        public int value;
        Test(int value){
            this.value = value;
        }
    }

キーとしてマップに渡すオブジェクトは参照によって渡されるため、オブジェクトの変更はキー セットにも反映されます。このようにして、オブジェクトに含まれるフィールドだけでなく、オブジェクト全体をキーとして使用できます。equals()ただし、適切なメソッドとメソッドを提供する際には注意が必要hashCode()です。

于 2013-10-05T20:39:21.203 に答える
0

内部の値が変化するとキーが変化する自動更新マップが欲しい..

さて、Map子の変更 ( ) で親の ae ストレージ ( )を変更するのは興味深いことですValue。デザインが良いかどうかはわかりません。

キーを に変更してValueも、map変更されません

したがって、カスタムMapを次のように記述します。

 public class MyMap extends LinkedHashMap<String, Value> {/**/}

そして、メソッドをオーバーライドし、メソッドを使用してput実装します。onValueChange()Interface

各子はMapthroughのインスタンスを格納しますinterface

だからここに行く....:

RegisterItf

public interface RegisterItf {
   public void onValueChange(String newKey, String oldKey, Value newValue);
}

マイマップ

public class MyMap extends LinkedHashMap<String, Value> implements RegisterItf{

    private static final long serialVersionUID = 1L;

    @Override
    public Value put(String key, Value value) {
        value.setReg(this); // send map instance to each child who registered
        return super.put(key, value);
    }

    @Override
    public void onValueChange(String newKey, String oldKey, Value newValue) {
        //here you remove old key and add new one
    }
}

価値

public class Value {
    private String mSomeData;
    private String mKey;

    private RegisterItf reg;


    public void setmKey(String key) {

        if(reg != null){
            reg.onValueChange(key, mKey, this);
        }

        this.mKey = key;
    }

   public void setReg(RegisterItf reg) {
        this.reg = reg;
    }
} 

主要

       MyMap map = new MyMap();

        Value val = new Value();
        val.setmKey("aa");
        val.setmSomeData("blabla");

        map.put(val.getmKey(), val);
...
于 2013-10-05T20:39:53.243 に答える