作为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());
}
}
我遇到的问题是,如果在hashmap中找到了结果,那么我需要打印键/值对。到目前为止,输出是:
尺寸: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: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"
的搜索中,返回所有结果,即“亚当,鲍勃和卡尔“
完整答案: 这个问题现在已经解决了,但只是部分归因于给出的答案,所以我会将其标记为最佳答案,但请在下面详细说明。
我不仅要包含toString我还需要操纵ObjectSet
,并且因为查询是基于TelephoneDirectory
我能够将ObjectSet
强制转换为{ {1}}。在这样做的过程中,我可以使用它自己的实例方法来操纵TelephoneDirectory
。
非常感谢您的时间和精力。
答案 0 :(得分:2)
实现目录的另一种方法是:
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();
}
}