link 如何在 HashMap 中将多个键指向相同的值
How link multiple keys to the same value in the HashMap
我正在尝试 link 将一个键的值转换为另一个键的值,但似乎无法正常工作。
例如,如果我正在创建 HashMap
并向其添加键值对 ("x", 0)
。然后我希望能够添加 other keys 映射到与第一个相同的值。
因此,如果我有 ("x", map.get("y"))
和 ("y", 0)
,我希望能够以某种方式 link 它。因此,如果我现在像 ("y", 10)
那样更新 "y"
键的值,那么我希望 map.get("x")
也应该 return 10
.
HashMap<String, Integer> map = new HashMap<>();
map.put("x", 0);
map.put("y", 0);
//I now somehow want to link the value of x so its dependent on y
System.out.println(map.get("x"));
//Should return 0
map.put("y", 10);
System.out.println(map.get("x"));
//Should return 10 now
我不知道如何让它工作,因为 x 总是得到 y 现在的值,而不是打印值时 y 的值。
如果要将一组键关联到同一个对象,可以使用可变对象作为一个值。
例如,您可以使用 StringBuilder
或实现自定义 class。与实现扩展 HashMap
并能够跟踪这些组的自己的地图的方法相比,它 更高效 并且 更容易 键并为每次调用 put()
、replace()
或 remove()
.
触发一系列更新
具有自定义可变 Container
的解决方案可能如下所示:
HashMap<String, Container<Integer>> map = new HashMap<>();
Container<Integer> commonValue = new Container<>(0);
map.put("x", commonValue);
map.put("y", commonValue);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
commonValue.setValue(10);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
Container
class 本身。
public class Container<T> {
private T value;
public Container(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
正如我已经说过的,另一种方法是使用 JDK 已经提供的可变 class。然后代码就差不多了:
HashMap<String, StringBuilder> map = new HashMap<>();
StringBuilder commonValue = new StringBuilder("0");
map.put("x", commonValue);
map.put("y", commonValue);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
commonValue.replace(0, commonValue.length(), "10");
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
输出(两个版本)
Value for 'x': 0
Value for 'y': 0
Value for 'x': 10
Value for 'y': 10
我正在尝试 link 将一个键的值转换为另一个键的值,但似乎无法正常工作。
例如,如果我正在创建 HashMap
并向其添加键值对 ("x", 0)
。然后我希望能够添加 other keys 映射到与第一个相同的值。
因此,如果我有 ("x", map.get("y"))
和 ("y", 0)
,我希望能够以某种方式 link 它。因此,如果我现在像 ("y", 10)
那样更新 "y"
键的值,那么我希望 map.get("x")
也应该 return 10
.
HashMap<String, Integer> map = new HashMap<>();
map.put("x", 0);
map.put("y", 0);
//I now somehow want to link the value of x so its dependent on y
System.out.println(map.get("x"));
//Should return 0
map.put("y", 10);
System.out.println(map.get("x"));
//Should return 10 now
我不知道如何让它工作,因为 x 总是得到 y 现在的值,而不是打印值时 y 的值。
如果要将一组键关联到同一个对象,可以使用可变对象作为一个值。
例如,您可以使用 StringBuilder
或实现自定义 class。与实现扩展 HashMap
并能够跟踪这些组的自己的地图的方法相比,它 更高效 并且 更容易 键并为每次调用 put()
、replace()
或 remove()
.
具有自定义可变 Container
的解决方案可能如下所示:
HashMap<String, Container<Integer>> map = new HashMap<>();
Container<Integer> commonValue = new Container<>(0);
map.put("x", commonValue);
map.put("y", commonValue);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
commonValue.setValue(10);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
Container
class 本身。
public class Container<T> {
private T value;
public Container(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
正如我已经说过的,另一种方法是使用 JDK 已经提供的可变 class。然后代码就差不多了:
HashMap<String, StringBuilder> map = new HashMap<>();
StringBuilder commonValue = new StringBuilder("0");
map.put("x", commonValue);
map.put("y", commonValue);
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
commonValue.replace(0, commonValue.length(), "10");
System.out.println("Value for 'x': " + map.get("x"));
System.out.println("Value for 'y': " + map.get("y"));
输出(两个版本)
Value for 'x': 0
Value for 'y': 0
Value for 'x': 10
Value for 'y': 10