HashMap(Java)给出了错误的结果

时间:2012-02-04 14:28:40

标签: java hashmap

我创建了一个哈希映射,其中每个条目对应3个值 关键对象值(数量为两个)

我创建了一个类,我的对象创建并将结果存储在哈希映射中 这是我下面的代码,其中我将输入数据与哈希映射中的先前值进行比较。如果相同的数据出现,那么我只是递增该数据的计数器。我已经在for循环中获取了print语句。虽然这两个字符串匹配但仍然我的代码永远不会出现在if循环中以增加计数器。为什么?

 for(i=1;i<=hMap.size();i++)
 {
      String skey = Integer.toString(i);
      if(hMap.get(skey).olddata==comingdata)
      {
           hMap.get(skey).counter=  hMap.get(skey).counter+1;
      }
 }

5 个答案:

答案 0 :(得分:2)

您没有提供足够的有关所涉及类型的信息,但是,我强烈怀疑这是问题所在:

if(hMap.get(skey).olddata==comingdata)

如果olddatacomingdata是某种类型的引用,那将是比较引用而不是相等。 (编辑:通过它的声音,它们是字符串引用。)

我的猜测是你想要的:

String skey = Integer.toString(i);
if(hMap.get(skey).olddata.equals(comingdata))
{
   hMap.get(skey).counter=  hMap.get(skey).counter+1;
}

或者更有效率,避免无意义的查找:

WhateverType value = hMap.get(Integer.toString(i));
if (value.olddata.equals(comingdata))
{
    value.counter++;
}

我还建议如果你总是要用整数查找,为什么不使用Integer键而不是总是将整数转换成字符串呢?

此外,值得遵循Java命名约定,如果它们尚未存在,则应将字段设为私有。

如果这些都没有帮助,请发布更多代码。问题出现在HashMap而不是代码中的可能性非常小。

答案 1 :(得分:1)

除非您试图查看它们是否具有相同的参考值,否则不要将对象与Java中的==进行比较。

if (hMap.get(skey).olddata.equals(comingdata)) {
...

你也不应该像这样暴露olddata;它应该通过吸气剂提供;例如getOldData()

答案 2 :(得分:1)

不清楚olddata的类型,但也许您应该使用equals()比较值:

if (hMap.get(skey).olddata.equals(comingdata))

在Java中,==用于比较相等的原始数据类型或比较 identity 的对象类型。如果需要比较 equality 的两个对象类型,那么必须使用equals()方法,该方法是为所有对象定义的,因为它是从Object类继承而来的您还必须覆盖类中的equals()hashCode(),为该类提供有意义的实现。

答案 3 :(得分:0)

应该是

if(hMap.get(skey).olddata.equals(comingdata))

答案 4 :(得分:0)

你的意思是comingdata.equals(hMap.get(skey).olddata)吗?此外,请注意equals(Object)hashCode()必须相互关联。