DB4o HashMap toString()

#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()