Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Cравнить на эквивалентность два HashMap'а


Автор: Den1s 4.10.2007, 11:14
Имею несортированных два хэшмапа:

hashmap1.toString() - {name=Name, last_name=Last, address=Home}
hashmap2.toString() - {last_name=Last, address=Home,name=Name}

как мне их сравнить? equals() естесственно выдает что они не равны, но мне надо сравнить так чтобы они сравнивались вне зависимости от сортировки.
 smile 

Автор: powerOn 4.10.2007, 12:56
Самый нехитрый способ - написать свое сравнение:
1) Сравниваем количество элементов в хм1 и хм2. Если длина хм1 (и хм2) равна 0, то они мапы равны. Если количества элементов не равны, то хм1 не равен хм2. 
2) Выбираем (с удалением) очередной элемент из хм1.
3) Ищем эквивалентный ему в хм2. Если находим, то удаляем эквивалентный из хм2.
4) Идем на шаг 1.

при этом, поскольку будет операция удаления, нужно учесть, что коллекции нужно восстановить к прежнему виду.

Автор: Den1s 4.10.2007, 13:09
Реализовал следующим способом

Код

                    
boolean isEquals = true;
Iterator it = hashmap1.keySet().iterator();
     while(it.hasNext()) {
         if ( hashmap2.get(it.next()) != null && ( hashmap1.get(it.next()).equals( hashmap2.get(it.next())))){
             continue;
         } else {
              isEquals = false;
              break;
               }
        }
if (isEquals) System.out.println("Maps are equals!");
else System.out.println("Maps are not equals!");


Автор: niasilil 5.10.2007, 17:27
Цитата(Den1s @ 4.10.2007,  13:09)
Реализовал следующим способом

Код

                    
boolean isEquals = true;
Iterator it = hashmap1.keySet().iterator();
     while(it.hasNext()) {
         if ( hashmap2.get(it.next()) != null && ( hashmap1.get(it.next()).equals( hashmap2.get(it.next())))){
             continue;
         } else {
              isEquals = false;
              break;
               }
        }
if (isEquals) System.out.println("Maps are equals!");
else System.out.println("Maps are not equals!");


Ты зря не сравнил количество элементов. Одна строчка кода и во многих случаях процессор не будет молотить бестолку. 

Автор: LSD 6.10.2007, 13:39
Цитата(Den1s @  4.10.2007,  14:09 Найти цитируемый пост)
Реализовал следующим способом

У тебя аж две ошибки в коде.
1. ты два раза вызываешь it.next(), и соответвенно у тебя будут возвращаться разные объекты. Т.е. фактически ты сравнишь только половину объектов, да еще и рискуешь получить NullPointerException.
2. ты неправильно проверяешь что ключ есть в Map m2.get(it.next()) != null. Если в качестве значения используется null, то ты считаешь, что они не равны, а это не так.

Да и вообще это все надо, если у всех Map нормально определен метод equals().

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)