2

我仍然不确定如何正确解释这一点,但我会尽力而为:

我有一组对象,其中包含我想用作地图键的值。

为了得到我正在寻找的对象,我可以简单地遍历集合,比较内部值;考虑到对象内的这些值之一可以用作键,这似乎效率低下。现在的问题是:如果我要更改对象内部的值,我还必须更新映射的键,难道没有可以促进这项任务的数据结构吗?

在本质上; 我想要一个自动更新的地图,其中的键随着内部值的变化而变化......我宁愿不必将地​​图存储在值中,所以,肯定有比我封闭的头脑更有效的思维方式吗?

我希望我已经很好地解释了自己,让我的想法得到了理解。

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任何子项更改 ( Value) 时更改父级 ae 存储 ( ) 很感兴趣。不知道设计好不好。

如果您将密钥更改为Valuemap则不会更改

所以我会写自定义Map

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

在那里我将覆盖put方法并onValueChange()使用Interface.

Map每个孩子都将存储through的实例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 回答