Java数据结构,使用值内的对象作为键的映射

时间:2013-10-05 20:30:26

标签: java dictionary data-structures set

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

我有一组对象,里面有我想用作地图键的值。

为了获得我正在寻找的对象,我可以简单地迭代集合,比较内部值,因为我去;考虑到对象中的一个值可以用作关键字,这似乎效率低下。 现在的问题是:如果我要更改对象内部的值,我还必须更新地图的关键字,是否没有可以促进此任务的数据结构?

本质上;我想要一个自动更新的地图,当内部的值发生变化时,键会发生变化...我宁愿不必将地​​图存储在值中,所以,肯定有一种更有效的思维方式而不是我的封闭心态?

我希望自己能够很好地解释自己的想法。

2 个答案:

答案 0 :(得分: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()方法。

答案 1 :(得分:0)

  

我想要一个自动更新的地图,当内部的值发生变化时,键会发生变化。

嗯,你有兴趣改变父母a.e.任何子更改(Map)的存储(Value)。我不知道它的设计是否合适。

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

所以我会写自定义Map,如:

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

然后我会覆盖put方法并使用onValueChange()实现Interface方法。

每个孩子都会存储Mapinterface的实例。

所以我们走了......:

<强> RegisterItf

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

<强> MyMap中

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);
...