2012-06-28 42 views
0

我问的SO searching for specific keys in multiple independent hashMap objects如何implemen这一点,或前一个问题,如果我要实现我的钥匙特定的新类。在我的HashMap的HashMap使用<字符串,字符串>作为重点对象<K,V>

最终,在进一步阅读文档之后,并注意到HashMap已经实现了equals()和hashcode()方法,我决定在代码中使用HashMap作为关键字。

我来测试,我已经建立了以下 类型的HashMap <一个HashMap的对象,对象> 它其实是从信息在数据库中建立。

对象本身包含类型的HashMap的成员

所以我遍历我对象的成员,并打印出结果......

for (HashMap<String, String> keVal: Object.getMember().keySet()) 
    { 
     System.out.println("the key of: " + keVal.toString() +"has a hash code of " + keVal.hashCode() + 
       "here is the data for this key:\n" + 
       Object.getMember().get(keVal).getColData().toString()); 

    } 

你会发现,我已经打印出来的信息为关于内容和它的哈希码keVal,好措施,然后在下面的行我打印出来的,涉及到指定keVal信息的会员的信息。然而 的问题是,我总是得到相同的一行信息,从我的地图回报。

这里是输出

the key of: {OBS=002018}has a hash code of 1420118533 here is the data for this key: 
{OBS=002035, CHIMIO1=null, CHIMIO2=null, DTHEMO=2011-11-09 00:00:00, PNN=7.4, ATCDND=0, HEMA=4.21, ALAT=23.0, LYMP=1.6, CHIMIOT1=0, CHIMIOT2=0, PNE=0.1, PNB=0.0, TAILLE=168, NBCY1=null, RXANT=0, NBCY2=null, CHIMIOX2=null, CONTRAC=1, CHIMIOX1=null, DTFCHIMIO1=null, DTFCHIMIO2=null, ASAT=21.0, ECRIT11=0, ECRIT10=0, SCORPO=1.81, MONO=0.5, HEMATO=38.2, CHIMIOANT=0, ID_VISIT=0, DTDCHIMIO2=null, DTDCHIMIO1=null, ECRIT25=0, ECRIT24=0, ECRIT23=0, LEUCO=9.6, ECRIT7=0, ECRIT8=0, ECRIT9=0, HB=13.2, ECRIT20=0, ECRIT21=0, ECRIT22=0, ECRIT1=0, ICRIT1=1, ECRIT2=0, ECRIT3=0, ECRIT4=0, ECRIT5=0, ECRIT6=0, PLQ=214.0, MENO=0, DTBIOCH=2011-11-09 00:00:00, ECRIT13=0, ECRIT12=0, ECRIT15=0, ECRIT14=0, ECRIT17=0, ECRIT16=0, ECRIT19=0, ECRIT18=0} 
the key of: {OBS=002017}has a hash code of 1420118532 here is the data for this key: 
{OBS=002035, CHIMIO1=null, CHIMIO2=null, DTHEMO=2011-11-09 00:00:00, PNN=7.4, ATCDND=0, HEMA=4.21, ALAT=23.0, LYMP=1.6, CHIMIOT1=0, CHIMIOT2=0, PNE=0.1, PNB=0.0, TAILLE=168, NBCY1=null, RXANT=0, NBCY2=null, CHIMIOX2=null, CONTRAC=1, CHIMIOX1=null, DTFCHIMIO1=null, DTFCHIMIO2=null, ASAT=21.0, ECRIT11=0, ECRIT10=0, SCORPO=1.81, MONO=0.5, HEMATO=38.2, CHIMIOANT=0, ID_VISIT=0, DTDCHIMIO2=null, DTDCHIMIO1=null, ECRIT25=0, ECRIT24=0, ECRIT23=0, LEUCO=9.6, ECRIT7=0, ECRIT8=0, ECRIT9=0, HB=13.2, ECRIT20=0, ECRIT21=0, ECRIT22=0, ECRIT1=0, ICRIT1=1, ECRIT2=0, ECRIT3=0, ECRIT4=0, ECRIT5=0, ECRIT6=0, PLQ=214.0, MENO=0, DTBIOCH=2011-11-09 00:00:00, ECRIT13=0, ECRIT12=0, ECRIT15=0, ECRIT14=0, ECRIT17=0, ECRIT16=0, ECRIT19=0, ECRIT18=0} 
the key of: {OBS=002019}has a hash code of 1420118534 here is the data for this key: 
{OBS=002035, CHIMIO1=null, CHIMIO2=null, DTHEMO=2011-11-09 00:00:00, PNN=7.4, ATCDND=0, HEMA=4.21, ALAT=23.0, LYMP=1.6, CHIMIOT1=0, CHIMIOT2=0, PNE=0.1, PNB=0.0, TAILLE=168, NBCY1=null, RXANT=0, NBCY2=null, CHIMIOX2=null, CONTRAC=1, CHIMIOX1=null, DTFCHIMIO1=null, DTFCHIMIO2=null, ASAT=21.0, ECRIT11=0, ECRIT10=0, SCORPO=1.81, MONO=0.5, HEMATO=38.2, CHIMIOANT=0, ID_VISIT=0, DTDCHIMIO2=null, DTDCHIMIO1=null, ECRIT25=0, ECRIT24=0, ECRIT23=0, LEUCO=9.6, ECRIT7=0, ECRIT8=0, ECRIT9=0, HB=13.2, ECRIT20=0, ECRIT21=0, ECRIT22=0, ECRIT1=0, ICRIT1=1, ECRIT2=0, ECRIT3=0, ECRIT4=0, ECRIT5=0, ECRIT6=0, PLQ=214.0, MENO=0, DTBIOCH=2011-11-09 00:00:00, ECRIT13=0, ECRIT12=0, ECRIT15=0, ECRIT14=0, ECRIT17=0, ECRIT16=0, ECRIT19=0, ECRIT18=0} 
the key of: {OBS=002014}has a hash code of 1420118529 here is the data for this key: 
{OBS=002035, CHIMIO1=null, CHIMIO2=null, DTHEMO=2011-11-09 00:00:00, PNN=7.4, ATCDND=0, HEMA=4.21, ALAT=23.0, LYMP=1.6, CHIMIOT1=0, CHIMIOT2=0, PNE=0.1, PNB=0.0, TAILLE=168, NBCY1=null, RXANT=0, NBCY2=null, CHIMIOX2=null, CONTRAC=1, CHIMIOX1=null, DTFCHIMIO1=null, DTFCHIMIO2=null, ASAT=21.0, ECRIT11=0, ECRIT10=0, SCORPO=1.81, MONO=0.5, HEMATO=38.2, CHIMIOANT=0, ID_VISIT=0, DTDCHIMIO2=null, DTDCHIMIO1=null, ECRIT25=0, ECRIT24=0, ECRIT23=0, LEUCO=9.6, ECRIT7=0, ECRIT8=0, ECRIT9=0, HB=13.2, ECRIT20=0, ECRIT21=0, ECRIT22=0, ECRIT1=0, ICRIT1=1, ECRIT2=0, ECRIT3=0, ECRIT4=0, ECRIT5=0, ECRIT6=0, PLQ=214.0, MENO=0, DTBIOCH=2011-11-09 00:00:00, ECRIT13=0, ECRIT12=0, ECRIT15=0, ECRIT14=0, ECRIT17=0, ECRIT16=0, ECRIT19=0, ECRIT18=0} 
the key of: {OBS=002013}has a hash code of 1420118528 here is the data for this key: 
{OBS=002035, CHIMIO1=null, CHIMIO2=null, DTHEMO=2011-11-09 00:00:00, PNN=7.4, ATCDND=0, HEMA=4.21, ALAT=23.0, LYMP=1.6, CHIMIOT1=0, CHIMIOT2=0, PNE=0.1, PNB=0.0, TAILLE=168, NBCY1=null, RXANT=0, NBCY2=null, CHIMIOX2=null, CONTRAC=1, CHIMIOX1=null, DTFCHIMIO1=null, DTFCHIMIO2=null, ASAT=21.0, ECRIT11=0, ECRIT10=0, SCORPO=1.81, MONO=0.5, HEMATO=38.2, CHIMIOANT=0, ID_VISIT=0, DTDCHIMIO2=null, DTDCHIMIO1=null, ECRIT25=0, ECRIT24=0, ECRIT23=0, LEUCO=9.6, ECRIT7=0, ECRIT8=0, ECRIT9=0, HB=13.2, ECRIT20=0, ECRIT21=0, ECRIT22=0, ECRIT1=0, ICRIT1=1, ECRIT2=0, ECRIT3=0, ECRIT4=0, ECRIT5=0, ECRIT6=0, PLQ=214.0, MENO=0, DTBIOCH=2011-11-09 00:00:00, ECRIT13=0, ECRIT12=0, ECRIT15=0, ECRIT14=0, ECRIT17=0, ECRIT16=0, ECRIT19=0, ECRIT18=0} 

的一个小片断正如你可以看到检索总是与OBS = 002035,这有趣的是在地图的最后一个值(如果我遍历它的价值检索成员数组)但不是在上面的打印输出? 点值得注意的是,无论多少次,我跑的代码,我总是得到OBS = 002035的副本,我的返回值指定的关键!

我有点失落,是它在HashMap中的错误^?或者我是如何回顾keVal会员的问题。或者是for循环的第一行实际上是一个潜在的classCastException,我需要以某种方式处理?

如果我实现了我自己的个人keyObject,然后有一个HashMap成员,并且对于HashMap成员中的值,implment equals()和hashCode()是否还会有同样的问题? (这可能是一个有点可笑的问题,因为我即将这样做并测试结果)。

EDIT1: 我可以在别处rogered我的代码,请参阅我下面路易响应。一旦我确认这是哪里出了问题我问MODS的删除的问题为“迟钝的程序员”问题不是一个真正的问题!

+2

......我们可以看到如何设置_up_地图,并把条目?这地方更有可能问题是, –

+0

事实上,我刚刚测试过这个,这似乎是问题出在哪里,当我输入数据时创建的测试打印出的数据表明数据是不同的,但似乎总是这样插入相同的对象信息,所以现在...不要回答这个问题,问题是在我的代码在其他地方 – DaveM

+0

我检查了我的代码,使用eclipse调试视图,并输出一些细节。所有似乎都是正确的。我将在代码中编辑我的问题。我只是需要为大家澄清一下...... – DaveM

回答

0

OK我发现这个问题...

一边读着,我是要发布的代码,并添加一些额外的意见,我发现这个问题,和解决方案。

的程序的流程如下:

抓斗数据的“SELECT * FROM [表名]” 遍历结果集,将每个行到一个临时对象。

问题/解决方案

我创造了我的临时对象来保存数据之前,我发出我的,而(resultSet.next())循环。 在这个循环中,我将信息添加到上面的临时对象中。

在移动到resultSet中的下一行之前(即下一次迭代时),我将temp对象传递到其他地方。

但是,虽然在首次亮相时,临时对象中的信息报告是正确的,但是使用它的过程似乎是使用原始版本创建的,而不是与while循环的当前迭代有关的那个版本?

将我的临时对象的创建移动到while循环的内部解决了问题。在这里它是在伪代码...

//bad code 
ResultSet rs = getDataFromDBMS("Select * from [tableName];"); 

Object temp = new objectToHoldInfoFromResultSet(); 

//loop over the result set 
while (rs.next)//for each row in the result set 
     { 
     for(int i=1; i<=rs.getNumberColums; i++) 
       { 
       temp.add(infoAboutColumn); 
       } 
     temp.printInfo();//prints correct info 
     anotherObject(makeUseOf(temp));//use info from first iteration. 


     } 

//Seemingly each loop into the while the temp.doSomethingToData(); uses the temp object created in the first iteration 

//good code 
ResultSet rs = getDataFromDBMS("Select * from [tableName];"); 


//loop over the result set 
while (rs.next)//for each row in the result set 
     { 
     Object temp = new objectToHoldInfoFromResultSet();//moving declaration of temp into the while loop solves the problem. 
     for(int i=1; i<=rs.getNumberColums; i++) 
       { 
       temp.add(infoAboutColumn); 
       } 
     temp.printInfo();//prints current info 

     anotherObject(makeUseOf(temp));//uses the current info. 


     } 

所以虽然上述解决了问题,它引起了另一个问题。

temp.printInfo();调用始终打印在while循环中获得的正确“当前”信息。另一个对象(makeUseOf(temp))然后从while循环的外部调用临时对象(如果这是我创建它的地方) - 即它看起来并不像temp.printInfo()调用引用相同的临时对象确实。

我会问这一个问题,并把在一个链接... here is the new question

相关问题