метод get () для HashMap

1

Я пытаюсь получить значение с помощью ключа. Я использую метод get(). Мой ключ - это объект, состоящий из int и String. Поэтому я делаю и

HashMap<Keys,String> test = readFile(fileName2);
Keys myKey = new Keys(2,"SM");
test.get(myKey);

И я получил нуль. Когда я смотрю на режим debbuging или когда я печатаю keySet, я получил что-то вроде этого

[Keys@d9c6e2, Keys@10285d8, Keys@c3dd7e]

хотя мой ключ должен быть

[1,"GM", 2,"SM", 3"PM"]

почему ключ выглядит так: Keys@d9c6e2 вместо 2,"SM"? и как получить значение с помощью ключа 2,"SM"?

Я переопределяю toString methid в Keys. Он выглядит лучше, но все же у меня есть нулевое значение, и я уверен, что есть некоторая ценность.

    Keys myKey = new Keys(2,"GL-G--T");
    System.out.println(myKey.toString());
    System.out.println(test.get(myKey.toString()));
    Set keyset = test.keySet();
    System.out.println(keyset);


    2,GL-G--T
    null
    [3,PNSN--G, 2,GL-G--T, 1,SM]
  • 0
    У вас есть метод toString на ваших ключах? Похоже, ссылка на объект Java отображается
Теги:
hashmap

3 ответа

1
Лучший ответ

Вы могли бы использовать специальный объект Keys в качестве ключа к вашему хешу map--, тогда вам просто нужно правильно реализовать hashCode и равняться по этому классу Keys, как объяснили другие.

Если у вас нет определенной причины не использовать, вы действительно можете просто использовать String в качестве ключа к хэш-карте. Создайте следующий метод:

private static String getHashMapKeyFor(int intKey, String stringKey) {
  return stringKey + "|" + intKey;
}

и объявить вашу хэш-карту как взятие строки в качестве типа ключа. Затем, когда вы хотите поместить/найти значение на карте хеша, сначала вызовите вышеуказанный метод, чтобы получить фактический ключ для хэш-карты.

Использование класса пользовательских объектов может иметь поверхностный воздух "правильности" или "конструктивности", но на самом деле просто использование String будет, как правило, работать одинаково хорошо, и если что-то может даже немного сэкономить на памяти.

  • 0
    Оно работает ! Спасибо!
4

Вам нужно переопределить метод toString в объекте Keys. В противном случае вы получите значение по умолчанию toString, предоставленное java.lang.Object.

Вы можете реализовать метод toString, чтобы выглядеть примерно так:

public class Keys {
    private final Integer i;
    private final String s;

    public Keys(Integer i, String s) {
        this.i = i;
        this.s = s;
    }

    @Override 
    public String toString() {
        return i + "," + s;
    }
}

если вы хотите, чтобы кавычки отображались, вам необходимо предоставить такие:

return i + ",\"" + s + "\"";

Вам также необходимо переопределить equals и hashCode, чтобы этот объект использовался в качестве ключа на карте:

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Keys)) {
            return false;
        }
        Keys other = (Keys)o;
        return other.s.equals(s) && other.i.equals(i);
    }

    @Override
    public int hashCode() {
        return toString().hashCode();
    }

Если вы не переопределяете значения equals и hashcode, тогда карта использует стандартные реализации, что приводит к двум объектам Keys с одинаковыми значениями, не равными.

  • 0
    Честно говоря, все это в конечном итоге переоценивается без ощутимой выгоды. Если метод hashCode () просто объединяет ключевые элементы в строку, а затем вызывает hashCode для этого, я бы просто полностью покончил со специальным объектом Keys и просто использовал бы сцепленную строку в качестве ключа для хэш-карты!
  • 0
    @Neil: я согласен, что этот конкретный пример слишком силен. но это показывает ОП, как заставить этот объект работать с картой.
Показать ещё 3 комментария
0

В объекте Keys.java переопределите метод toString. В настоящее время он использует метод, определенный в java.lang.Object # toString

  • 0
    На самом деле, решение проблемы OP - переопределить hashCode и equals .
  • 0
    Ах да, я пропустил это. Меа виноват Дэвид
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню