Сравнение карт со списками в Java - PullRequest
1 голос
/ 16 июня 2011

Я недавно столкнулся с хорошей проблемой, у меня есть Карта

 LinkedHashMap<String, List<MyCustomObject>>

Мне нужно сравнить это с другой Картой, которая будет заполнена точно таким же способом, если данные в БДТо же самое.

На самом деле происходит то, что я заполняю map1 в момент времени 0 и заполняю map2 в момент времени t, используя один и тот же метод Java (когда я говорю это, я имею в виду использование одних и тех же БД / таблиц и т. д.).) Таким образом, если данные на стороне БД одинаковы, то эти две карты должны иметь одинаковое содержимое в одном и том же порядке (надеюсь !!)

Теперь я хочу сравнить эти две карты, и если они не совпадаютравные (то есть некоторые новые данные были получены из БД), тогда я хочу сделать какое-то действие. Если они одинаковые, я просто хочу оставить это так.

Может кто-нибудь указать мне, чтопоможет мне понять, как это сделать ??

Является ли сериализация ответом на это ??

Спасибо, Neeraj

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

просто используйте equals:

if (!map1.equals(map2)) {
    //they differ
}

вам придется реализовать equalshashCode!) На MyCustomObject, поскольку (если я правильно понимаю) объекты будут иметь одинаковое содержимое, но разную идентичность (по умолчанию equals просто сравнивает указатели - т. е. адрес памяти, в котором находится объект).

2 голосов
/ 16 июня 2011

Убедитесь, что ваш класс MyCustomObject реализует соответствующие методы equals и hashcode, и тогда это так же просто, как получить результат map1.equals(map2).

Это то, что javadocs должен сказать об этом:

Сравнивает указанный объект с этой картой на равенство.Возвращает true, если данный объект также является картой и две Карты представляют одинаковые отображения.Более формально, две карты t1 и t2 представляют одинаковые отображения, если t1.entrySet (). Equals (t2.entrySet ()).Это гарантирует, что метод equals работает правильно в разных реализациях интерфейса Map.

1 голос
/ 16 июня 2011

Другие ответы хороши, и вот иллюстрация, что действительно, функции карты перебирают ключи и значения (и сравнивают элементы из списков) для сравнения на равенство. Как говорится, вам нужно переопределить hashCode и равно.

static public List<String> getStringList(String... arg) {
    ArrayList<String> arrayList = new ArrayList<String>();
    for(int x=0;x<arg.length;x++) arrayList.add(arg[x]);
    return arrayList;
}

static public void main(String[] arg) {
    LinkedHashMap<String, List<String>> mapA = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapB = new LinkedHashMap<String, List<String>>();
    LinkedHashMap<String, List<String>> mapC = new LinkedHashMap<String, List<String>>();
    mapA.put("same", getStringList("a", "b", "c"));
    mapB.put("same", getStringList("a", "b", "c"));
    mapC.put("same", getStringList("a", "b", "d"));
    System.out.println(mapA.equals(mapB) ? "true" : "false");
    System.out.println(mapA.equals(mapC) ? "true" : "false");
}
...