#java #set #hashmap #tostring #db4o
#java #установить #хэш-карта #tostring #db4o
Вопрос:
В качестве учебного пособия для DB4o и Java я начал создавать телефонный справочник. Для этого я создаю экземпляр TelephoneDirectory, который содержит год и хэш-карту записей.
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());
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что если результат найден в hashmap, то мне нужно, чтобы была напечатана пара ключ / значение. Пока что результат является:
Размер: 1 телефонный справочник.Телефонный справочник@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: Боб
Я уверен, что это что-то простое, что я упускаю из виду.
Заранее спасибо.
РЕДАКТИРОВАТЬ: Я только что понял, что использую ObjectSet как результат QBE. Кажется, это не дает мне больше света на проблему, но, возможно, это предоставляет другой метод реализации?
ОБНОВЛЕНИЕ: Основываясь на усилиях PeterMmm, я теперь скорректировал его ответ следующим образом:
@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
, и поскольку запрос был основан на a TelephoneDirectory
, я смог привести ObjectSet
обратно к a TelephoneDirectory
. Делая это, я затем смог манипулировать TelephoneDirectory
, используя его собственные методы экземпляра.
Большое вам спасибо за ваше время и усилия.
Ответ №1:
Другим способом реализации каталога было бы:
public class TelephoneEntry {
private int year;
private String name;
private String tel;
....
}
Коллекция, которой вы управляете через hashmap, будет управляться db4o за вас.
Обновление После короткого обсуждения вы можете переопределить TelephoneDirectory.toString() :
class TelephoneDirectory {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Object k : hashmap.keySet()) {
// details for you
}
return sb.toString();
}
}
Комментарии:
1. Это означало бы создание (для каталога размером 100) 100 экземпляров TelephoneDirectory, где в настоящее время требуется только 1.
2. Является ли хэш-карта в вашем постоянном классе обязательным требованием или это ваш дизайнерский выбор? Когда вы используете базу данных объектов, в чем проблема иметь 1, 100, 1000 или 1.000.000 экземпляров. Для этого и созданы базы данных.
3. К сожалению, это требование. Было бы намного проще, как вы описали.
4. Тем не менее, это берет всю хэш-карту из этого экземпляра TelephoneDirectory, а не подмножество хэш-карты, возвращаемое lookupName()