我仍然不确定如何正确解释这一点,但我会尽力给予它:
我有一组对象,里面有我想用作地图键的值。
为了获得我正在寻找的对象,我可以简单地迭代集合,比较内部值,因为我去;考虑到对象中的一个值可以用作关键字,这似乎效率低下。 现在的问题是:如果我要更改对象内部的值,我还必须更新地图的关键字,是否没有可以促进此任务的数据结构?
本质上;我想要一个自动更新的地图,当内部的值发生变化时,键会发生变化...我宁愿不必将地图存储在值中,所以,肯定有一种更有效的思维方式而不是我的封闭心态?
我希望自己能够很好地解释自己的想法。
答案 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
)。我不知道它的设计是否合适。
如果您将密钥更改为Value
,map
不会更改
所以我会写自定义Map
,如:
public class MyMap extends LinkedHashMap<String, Value> {/**/}
然后我会覆盖put
方法并使用onValueChange()
实现Interface
方法。
每个孩子都会存储Map
到interface
的实例。
所以我们走了......:
<强> 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);
...