2011-04-25 54 views
3

作为DB4o和Java的学习工具,我开始创建一个电话号码簿。为此,我创建一个TelephoneDirectory的实例,其中包含一年和条目的HashMap。DB4o HashMap toString()

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 [email protected]

这显然是因为没有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的结果。它似乎并没有让我对这个问题有更多的了解,但它可能提供了不同的实现方法?

UPDATE:基于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"所有结果返回,即“亚当,鲍勃和卡尔”

完整的答案: 的概率lem现在已经解决了,但部分原因是由于给出的答案,所以我会将其标记为最佳答案,但在下面提供全部细节。

我不仅应该包括了toString我还需要操纵ObjectSet,因为查询是基于在TelephoneDirectory我能投的ObjectSetTelephoneDirectory。在这样做的时候,我可以使用它自己的实例方法来操作TelephoneDirectory

非常感谢您的时间和精力。

回答

2

Anothe的方式来实施目录将是:

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

这将意味着创建(尺寸为100的目录)100个实例电话簿,这里目前只需要1。 – 2011-04-26 09:12:32

+0

您的持久类中的散列图是需求还是您的设计选择?当您使用对象数据库时,遇到1,100,1000或1.000.000个实例有什么问题。这就是数据库的作用。 – PeterMmm 2011-04-26 14:21:03

+0

不幸的是这是一个要求。你描述的方式会更简单。 – 2011-04-26 14:32:01