Как инструмент обучения для DB4o и Java, я начал создавать телефонный справочник.Для этого я создаю экземпляр TelephoneDirectory, который содержит год и HashMap записей.
public class TelephoneDirectory {
private int year;
private HashMap<String, String> hashmap;
public TelephoneDirectory(int year) {
this.year = year;
this.hashmap = new HashMap<String, String>();
}
public int getYear() {
return year;
}
public HashMap getHashmap() {
return hashmap;
}
public void addEntry(String name, String number) {
hashmap.put(number, name);
}
}
Поэтому я добавляю несколько записей с addEntry
.Я хотел бы найти в телефонном справочнике конкретное имя.Для этого я использую QueryByExample (QBE), например так:
public static void lookupName(String name, int year, ObjectContainer db) {
TelephoneDirectory proto = new TelephoneDirectory(year);
proto.addEntry(name, null);
ObjectSet result=db.queryByExample(proto);
System.out.println("Size:" + result.size());
while(result.hasNext()) {
System.out.println(result.next());
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что если результат найден в хэш-карте, тогда мне нужно, чтобы пара ключ / значение былараспечатаны.Пока что вывод:
Размер: 1 telephonedirectory.TelephoneDirectory@da4b71
Это, очевидно, потому что нет метода toString()
.Но что я помещаю в метод toString (), поскольку в результате будет присутствовать только подмножество значений hashmap.
Пример
TelephoneDirectory dir = new TelephoneDirectory(2011);
dir.addEntry("12345", "Adam");
dir.addEntry("67890", "Bob");
dir.addEntry("24680", "Carl");
И я тогда запрос:
lookupName("Bob", 2011, db);
Ожидаемый результат:
2011 -67890: Боб
Я уверен, что это что-то простое, что я упускаю из виду.
Заранее спасибо.
РЕДАКТИРОВАТЬ: Iтолько что понял, что я использую ObjectSet в результате QBE.Это, кажется, не дает мне больше света в проблеме, но, возможно, предоставляет другой метод реализации?
ОБНОВЛЕНИЕ: Основываясь на усилиях Питера Ммм, я теперь корректировал его ответ следующим образом:
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(year + "\n");
for (Object k : hashmap.keySet()) {
sb.append(k + ": " + this.lookupName((String)k) + "\n");
}
return sb.toString();
}
Проблема здесь, конечно, заключается в том, что метод toString все ещеиспользует хэш-карту всего экземпляра, т.е. hashmap.keySet();
вместо ObjectSet result
, и поэтому при поиске "bob"
возвращаются все результаты, т. е. «Адам, Боб и Карл»
Полный ответ: Проблема теперь решена, но только частично из-за предоставленного ответа, поэтому я отмечу его как лучший ответ, но приведу подробное описание ниже.
Не только я должен включить toString, но и манипулироватьObjectSet
, и поскольку запрос был основан на TelephoneDirectory
, я смог привести ObjectSet
обратно к TelephoneDirectory
.Тогда я смог манипулировать TelephoneDirectory
, используя собственные методы экземпляра.
Большое спасибо за ваше время и усилия.