我在SO searching for specific keys in multiple independent hashMap objects上提出了一个关于如何实现这个问题的问题,或者我是否应该为我的密钥实现一个特定的新类。
最后,在进一步阅读文档之后,并注意到HashMap已经实现了equals()和hashcode()方法,我决定在我的代码中使用HashMap作为键是好的。
我来测试,我已经构建了以下类型的对象 的HashMap< HashMap,对象> 它实际上是从数据库中的信息构建的。
对象本身包含HashMap类型的成员
所以我遍历我的Object成员,并打印结果......
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,我需要以某种方式处理它?</ p>
如果我实现自己的个人keyObject,然后有一个HashMap成员,并且对于HashMap成员中的值有implment equals()和hashCode(),我还会遇到同样的问题吗? (这可能是一个有点奇怪的问题,因为我将要做任何如何测试结果)。
EDIT1: 我可能已经将我的代码转移到其他地方,请参阅我对路易斯的回复。一旦我确认这是问题所在,我要求mods将问题删除为'dopey programmer'问题而不是真正的问题!
答案 0 :(得分:0)
好的,我发现了问题......
在阅读我要发布的代码,并添加一些额外的评论时,我发现了问题和解决方案。
该计划的流程如下:
使用“select * from [tableName]”抓取数据 循环遍历结果集,将每一行放入临时对象。
问题/解决方案
我在发出while(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(); call总是打印在while循环中获得的正确“当前”信息。 然而,另一个对象(makeUseOf(temp))从while循环外部调用临时对象(如果这是我创建它的地方) - 也就是说它似乎没有像temp.printInfo()调用那样引用相同的临时对象
我会在另一个问题中提出这个问题,然后加上一个链接...... here is the new question