繁体   English   中英

如何将多个键链接到 HashMap 中的相同值

[英]How link multiple keys to the same value in the HashMap

我试图将一个键的值链接到另一个键的值,但似乎无法正常工作。

例如,如果我正在创建一个HashMap并向其添加键值对("x", 0) 然后我希望能够添加映射到与第一个相同的值的其他键

因此,如果我有("x", map.get("y"))("y", 0)我希望能够以某种方式链接它。 因此,如果我现在像("y", 10)那样更新"y"键的值,那么我希望map.get("x")也应该返回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 的值。

如果要将一组相同的 object相关联,可以通过使用可变的 object作为值来实现。

例如,您可以使用StringBuilder或实现自定义 class。它比实现您自己的 map 的方法性能更高、更容易,它扩展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"));

Output(两个版本)

Value for 'x': 0
Value for 'y': 0
Value for 'x': 10
Value for 'y': 10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM