Я пытаюсь получить значение с помощью ключа. Я использую метод 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]
Вы могли бы использовать специальный объект Keys в качестве ключа к вашему хешу map--, тогда вам просто нужно правильно реализовать hashCode и равняться по этому классу Keys, как объяснили другие.
Если у вас нет определенной причины не использовать, вы действительно можете просто использовать String в качестве ключа к хэш-карте. Создайте следующий метод:
private static String getHashMapKeyFor(int intKey, String stringKey) {
return stringKey + "|" + intKey;
}
и объявить вашу хэш-карту как взятие строки в качестве типа ключа. Затем, когда вы хотите поместить/найти значение на карте хеша, сначала вызовите вышеуказанный метод, чтобы получить фактический ключ для хэш-карты.
Использование класса пользовательских объектов может иметь поверхностный воздух "правильности" или "конструктивности", но на самом деле просто использование String будет, как правило, работать одинаково хорошо, и если что-то может даже немного сэкономить на памяти.
Вам нужно переопределить метод 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 с одинаковыми значениями, не равными.
В объекте Keys.java переопределите метод toString. В настоящее время он использует метод, определенный в java.lang.Object # toString
hashCode
и equals
.