Удалить дубликаты из списка записей HashMap - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть List<HashMap<String,Object>>, который представляет базу данных, где каждая запись списка является строкой базы данных.

У меня есть 10 столбцов в моей базе данных. Есть несколько строк, в которых значения двух отдельных столбцов равны. Мне нужно удалить дубликаты из списка после обновления списка со всеми строками из базы данных.

Какой эффективный способ?

К вашему сведению - я не могу сделать отдельное при запросе базы данных, потому что имя группы добавляется на более позднем этапе к Map после загрузки базы данных. И поскольку столбец Id не является первичным ключом, после добавления GroupName к Map. У вас будут дубликаты на основе комбинации Id + GroupName!

Надеюсь, мой вопрос имеет смысл. Дайте мне знать, если нам нужно больше разъяснений.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2010
  1. создайте Comparator, который сравнивает HashMaps и сравнивает их, сравнивая интересующие вас пары ключ / значение.
  2. использовать Collections.sort(yourlist, yourcomparator);
  3. Теперь все карты, которые похожи друг на друга на основе вашего компаратора, находятся в списке рядом.
  4. Создать новый список.
  5. Перебирайте свой первый список, отслеживая то, что вы видели последним. Если текущее значение отличается от предыдущего, добавьте его в новый список.
  6. Ваш новый список не должен содержать дубликатов в соответствии с вашим компаратором.

Стоимость итерации по списку составляет O (n). Сортировка O (n log n). Таким образом, этот алгоритм O (n log n).

Мы также можем сортировать на лету, используя TreeSet с этим компаратором. Вставки O (log n). И мы должны сделать это n раз. Итак, мы получаем O (n log n).

1 голос
/ 05 июля 2011

Я взял класс Employee и создал Map с Integer, объект Employee в качестве пары ключ-значение вот моя карта

Map<Integer,Employee> map = new HashMap<Integer,Employee>();

Класс Employee является классом bean-компонента и имеет такие свойства, как имя, идентификатор, обозначение; карта позволяет уникальные ключи. но если вы не хотите разрешать повторяющиеся значения на вашей карте вы должны переопределить метод равных в классе бобов.

@Override
public boolean equals(Object object){
    if (object == null) return false;
    if (object == this) return true;
    if (this.getClass() != object.getClass())return false;
    Employee employee = (Employee)object;
    if(this.hashCode()== employee.hashCode())return true;
   return false;
}  

и при добавлении значения ключа к карте необходимо использовать метод содержит

if(!map.containsValue(map.get(id))){
   map.put(id,employee);
}

containsValue внутренне вызывает метод equals() и, следовательно, вы перебираете метод равных он будет проверять каждое значение (объект) с предыдущими объектами, и если хеш-коды одинаковы возвращает true означает, что оба объекта являются одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...