DB4o HashMap toString()

3

作为学习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());
  }
}

我遇到的问题是,如果在哈希图中找到结果,则需要打印键/值对。到目前为止,输出结果为:

Size:1 telephonedirectory.TelephoneDirectory@da4b71

这显然是因为没有toString()方法。但是,在toString()方法中我应该放什么,因为只有哈希图值的子集将出现在结果中。 示例:
TelephoneDirectory dir = new TelephoneDirectory(2011);
dir.addEntry("12345", "Adam");
dir.addEntry("67890", "Bob");
dir.addEntry("24680", "Carl");

然后我进行查询:

lookupName("Bob", 2011, db);

期望结果:

2011 - 67890:Bob

我相信这是我忽略的一些简单问题。

提前感谢。

编辑:我刚意识到我正在使用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,即hashmap.keySet();而不是ObjectSet result,因此,在搜索"bob"时返回所有结果,即 "Adam, Bob和Carl"。
完整答案: 问题现在已经解决,但只有部分原因是由于给出的答案,因此我将其标记为最佳答案,但以下是完整细节。
我不仅应该包括toString,还需要操作ObjectSet,因为查询基于TelephoneDirectory,所以我可以将ObjectSet强制转换回TelephoneDirectory。通过这样做,我随后能够使用它自己的实例方法来操作TelephoneDirectory
非常感谢您的时间和努力。
1个回答

2
另一种实现目录的方法是:
public class TelephoneEntry {
  private int year;
  private String name;
  private String tel;

  ....
}

你通过哈希映射管理的集合将由db4o代为管理。
更新:在简短的讨论后,你可以重写TelephoneDirectory.toString()方法:
class TelephoneDirectory {

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Object k : hashmap.keySet()) {
            // details for you 
        }
        return sb.toString();
    }
}

这意味着需要创建100个TelephoneDirectory实例(对于大小为100的目录),而当前只需要1个。 - Adam Holmes
你的持久类中的哈希表是必须的还是你的设计选择?当你使用对象数据库时,拥有1个、100个、1000个或1000000个实例会有什么问题。这就是数据库的作用所在。 - PeterMmm
很遗憾,这是必须的。按照你所描述的方式会简单得多。 - Adam Holmes
即使如此,这将获取整个哈希表而不是lookupName()返回的哈希表子集,后者来自TelephoneDirectory实例。 - Adam Holmes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接