Java 多个键直接指向相同的值

  • 本文关键字:Java java java-8
  • 更新时间 :
  • 英文 :


有没有办法将多个键指向相同的值?

HashMap<String, Float> mymap = new HashMap<>();
mymap.put("hello",5f);
mymap.put("bye",5f);
~somehow point bye and hello to the same value~
mymap.put("bye", mymap.get("bye") +5f)
mymap.get("hello") == 10

Java HashMap 存储对对象的引用。如果使用两个不同的键存储同一对象,则键将指向相同的值。

但这不是你的问题。您的问题是您使用的是浮点值,而浮点是不可变的数据类型。创建后,您无法更改其值。要实现您想要执行的操作,您需要创建一个可变的 Float,或者将浮点存储在容器中并将该容器存储在映射中。最简单的容器之一是单元素数组(尽管我只会在示例代码中使用它,而不是在生产代码中使用它,因为它容易出错并且"自我不可记录"(。

HashMap<String, Float[]> mymap = new HashMap<>();
Float[] val = new Float[] { 5f };
mymap.put("hello", val);
mymap.put("bye", val);
...
mymap.get("bye")[0] = mymap.get("bye")[0] + 5f;
mymap.get("hello")[0] == 10f

您需要一个可变对象作为 Value 作为值,例如:

static class FLoatHolder {
private float f;
public FLoatHolder(float f) {
this.f = f;
}
public float getF() {
return f;
}
public void setF(float f) {
this.f = f;
}
}

Map<String, FLoatHolder> map = new HashMap<>();
FLoatHolder fh = new FLoatHolder(5f);
map.put("bye", fh);
map.put("hello", fh);
FLoatHolder holder = map.get("bye");
holder.setF(holder.getF() + 0.5f);
map.put("bye", holder);
System.out.println(map.get("hello").getF());

如果您只想让两个键指向相同的值,那完全没问题。地图不在乎它们指向什么,只是没有冲突的键。

如果要将整数值相加,则伪代码将按预期工作。

如果你想要类似指针的行为,其中更改键 A 的值会影响键 B 的值,那么你必须创建一个包装对象并使用字段。

像这样:

class Pointer<T> {
private T t;
public Pointer(T t) {
set(t);
}
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
...
Map<String, Pointer> map = new HashMap<>();
Pointer<Integer> ptr = new Pointer<>(5);
map.put("A", ptr);
map.put("B", ptr);
System.out.println(map.get("A").get());
System.out.println(map.get("B").get());
ptr.set(25);
System.out.println(map.get("A").get());
System.out.println(map.get("B").get());

如果你想要其他东西,你可能需要详细说明或考虑另一种数据结构。

最新更新