DB4o HashMap toString () - PullRequest
       13

DB4o HashMap toString ()

3 голосов
/ 25 апреля 2011

Как инструмент обучения для 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, используя собственные методы экземпляра.

Большое спасибо за ваше время и усилия.

1 Ответ

2 голосов
/ 26 апреля 2011

Другим способом реализации каталога будет:

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();
    }
}
...