HashMap (Java) дает неверные результаты - PullRequest
0 голосов
/ 04 февраля 2012

Я создал хеш-карту, в которой каждая запись соответствует 3 значениям Значения ключевых объектов (которых два)

Я создал класс, чей объект я создаю и сохраняю результаты в хэш-карте Это мой код ниже, в котором я сравниваю свои входящие данные с предыдущими значениями в хэш-карте. Если приходят те же данные, я просто увеличиваю счетчик этих данных. Я взял операторы print в цикле for. хотя две строки совпадают, но мой код никогда не входит в цикл 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 ]

2 голосов
/ 04 февраля 2012

Вы почти не предоставили достаточно информации о задействованных типах, но я сильно подозреваю, что это проблема:

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

Это будет сравнение ссылок , ачем для равенства, если olddata и comingdata являются ссылками некоторого вида.(РЕДАКТИРОВАТЬ: Судя по всему, это строковые ссылки.)

Я предполагаю, что вы хотите:

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 голос
/ 04 февраля 2012

Неясно, тип olddata, но, возможно, вам следует сравнить значения, используя equals():

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

В Java == используется для сравнения примитивных типов данных для равенство или сравнение типов объектов для идентичность .Если вам нужно сравнить два типа объектов для равенства , то вы должны использовать метод equals(), который определен для всех объектов, поскольку он унаследован от класса Object, помня о том, что вы также должны переопределитьequals() и hashCode() в вашем классе, обеспечивая реализации, значимые для этого класса.

1 голос
/ 04 февраля 2012

Вы не сравниваете объекты с == в Java, если только вы не пытаетесь увидеть, имеют ли они одинаковое ссылочное значение .

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

Вы также не должны выставлять olddata таким образом; он должен быть доступен через геттер; например getOldData()

0 голосов
/ 04 февраля 2012

Вы действительно имеете в виду comingdata.equals(hMap.get(skey).olddata)?Кроме того, помните, что equals(Object) и hashCode() должны быть реализованы корректно.

0 голосов
/ 04 февраля 2012

должно быть

if(hMap.get(skey).olddata.equals(comingdata))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...