Несколько ключей Java указывают на одинаковые значения - PullRequest
0 голосов
/ 06 сентября 2018

Есть ли способ указать нескольким ключам одно и то же значение?
т.е.

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 ]

0 голосов
/ 06 сентября 2018

Для этого вам понадобится изменяемый объект в качестве значения, например:

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());
0 голосов
/ 06 сентября 2018

Если вы просто хотите, чтобы две клавиши указывали на одно и то же значение, это прекрасно. Карты не заботятся о том, на что они указывают, просто нет конфликтующих клавиш.

Если вы хотите сложить целочисленные значения вместе, то ваш псевдокод работает так, как вы предполагаете.

Если вам нужно поведение, похожее на указатель, когда изменение значения ключа 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());

Если вы хотите что-то еще, вам может потребоваться разработать или рассмотреть другую структуру данных.

0 голосов
/ 06 сентября 2018

Java HashMap хранит ссылки на объекты. Если вы храните один и тот же объект с двумя разными ключами, ключи будут указывать на одно и то же значение.

Но это не твоя проблема. Ваша проблема в том, что вы используете значения Float, а Float является неизменным типом данных. Вы не можете изменить его значение после его создания. Чтобы достичь того, что вы хотите сделать, вам нужно либо создать изменяемый объект 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...