代码之家  ›  专栏  ›  技术社区  ›  DsCpp

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

  •  2
  • DsCpp  · 技术社区  · 7 年前

    有没有办法把几个键指向同一个值?

    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
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   Torben    7 年前

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

    但那不是你的问题。您的问题是,您使用的是浮点值,而浮点是一种不可变的数据类型。一旦创建了它,就不能更改它的值。要实现您想要做的事情,您需要创建一个可变的Float,或者将该Float存储在一个容器中并将该容器存储在map中。最简单的容器之一是一个单元素数组(尽管我只在示例代码中使用它,而不会在生产代码中使用它,因为它容易出错,而且是“自不可文档化的”)。

    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
    
        2
  •  3
  •   Eugene    7 年前

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

    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());
    
        3
  •  0
  •   MeetTitan    7 年前

    比如:

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

    如果需要其他数据结构,可能需要详细说明或考虑其他数据结构。