Сохранение нового объекта в качестве значения хэш-карты?
Я пытаюсь найти способ хранения нового экземпляра класса в качестве значения в хэш-карте Java. Идея была дана мне инструктором Java, чтобы создать структуру хранения данных, которая может быть использована для программы, над которой я работаю.
Идея, которую он мне рекомендовал, заключалась в том, чтобы использовать хэш-карту, которая хранит имя компьютера в качестве ключа, а значение будет новым экземпляром класса InfoStor.class. InfoStor содержит такие методы, как getName(), setName(), getMemory()...
У меня есть класс и метод, в значительной степени настраиваемый для базового теста, чтобы увидеть, будет ли он работать или нет. Проблема, с которой я сталкиваюсь, я не могу понять, как использовать методы внутри InfoStor, как только я создал новую запись в хэш-карте.
Это код, который у меня есть до сих пор;
VMware.class
import java.util.HashMap;
public class VMware {
public static void main(String[] args) {
HashMap <String, Object> mapper = new HashMap();
mapper.put("NS01", new InfoStor("NS01"));
//mapper.get("NS01").
}
}
InfoStor.class
public class InfoStor {
private String vmName;
private String platform;
private Integer memory;
public InfoStor (String name) {
vmName = name;
}
String getName(){
return vmName;
}
void setPlatform(String p){
platform = p;
}
String getPlatform(){
return platform;
}
void setMemory(Integer m){
memory = m;
}
Integer getMemory(){
return memory;
}
}
То, что я пытаюсь выполнить, это что-то вроде этого (основная идея).
Object var = mapper.get("NS01");
System.out.println(var.getMemory());
Неужели я ошибаюсь? Любая помощь приветствуется.
Ответы
Ответ 1
Проблема заключается в том, что ваш код указывает только, что значения на карте Object
. Вы знаете больше, поэтому сообщите компилятору, что информация:
HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();
mapper.put("NS01", new InfoStor("NS01"));
...
InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();
Обратите внимание, что обычно не всегда лучше использовать интерфейсы для типов переменных - и вы можете использовать оператор бриллианта для вызова конструктора, позволяя компилятору использовать вывод типа для заполнения аргументов типа:
Map<String, InfoStor> mapper = new HashMap<>();
mapper.put("NS01", new InfoStor("NS01"));
...
InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();
Ответ 2
Если вы объявляете свой хэш файл следующим образом:
HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();
Затем, когда вы выберете объект из mapper, это будет экземпляр InfoStor
(вам не нужно будет бросать его или беспокоиться о исключении класса, потому что это не класс rist.)
Итак:
InfoStor myStor = mapper.get("somekey");
myStor.getMemory(); // this will work
В противном случае, если вы придерживаетесь HashMap<String, Object>
, который вы использовали в своем исходном коде, вам нужно будет отбросить его до вызова метода:
Object obj = mapper.get("somekey");
((InfoStor)obj).getMemory(); // cast is required
obj.getMemory(); // this will not compile
Вы должны прочитать о дженериках Java.
Ответ 3
Использовать дженерики, добавленные в java. Они помогают с проверкой типа времени компиляции, и они делают ненужными броски.
HashMap <String, Object> mapper = new HashMap();
//you will be able to retrieve an object and then cast it to your InfoStore
InforStore isN01 = (InfoStore)mapper.get("N01");
//this will unfortunately be accepted, even thought it a bug
mapper.put("N02", new Integer(0));
________________________
HashMap <String, InfoStore> mapper = new HashMap();
//you will be able to retrieve an object and then cast it to your InfoStore
InforStore isN01 = mapper.get("N01"); //no cast
Ответ 4
Вы на правильном пути...
Инициализируйте карту как:
HashMap <String, InfoStor> mapper = new HashMap<String, InfoStor>();
Затем, после добавления объектов к карте, их можно найти с помощью:
InfoStor var = mapper.get("NS01");
System.out.println(var.getMemory());
Ответ 5
вы можете что-то приготовить с помощью массива... например, если вы можете хранить объекты в массивах, тогда используйте эту идею, чтобы достичь ее в хэш-карте... я не знаю, как вы разрабатываете, но я однажды застрял в этом и сделал через это
Пример...
классная принцесса {
int age;
public princess(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
public class hashmaptest {
public static void main(String[] args) {
princess[] p=new princess[10];
HashMap scores = new HashMap();
scores.put("a",new princess(6));
scores.put("b",new princess(7));
p[0]=(princess)scores.get("a");
System.out.println(p[0].getAge());
p[0]=null;
p[0]=(princess)scores.get("b");
System.out.println(p[0].getAge());
}
}