2010-02-03 5 views
2

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

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

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

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

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

+0

Вопрос: какие из них нужно удалить и какие из них нужно сохранить? – BalusC

+0

Почему вы вставляете дубликаты в первую очередь? Я имею в виду, почему вы не проверяете дубликаты при вставке? – 3lectrologos

+0

Я уже объяснил причину в своем вопросе.Значения в HashMap обновляются после начальной загрузки из базы данных. Именно поэтому я могу применить условие дублирования в первую очередь. – jagamot

ответ

3
  1. создать компаратор, который сравнивает 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).

+0

Я надеюсь, что это решение также эффективно, даже если мой список имеет более 1 миллиона строк! – jagamot

+1

Возможно, стоит отметить, что в большинстве коллекций, включенных в HashMap, вы можете просто удалить() дублированный объект. С помощью HashMap вы передаете ключ для удаления(). Таким образом, вам не потребуется дублировать список или карту. – jonescb

+4

Что это за миллионы строк в памяти Java? Почему вы практически дублируете БД в памяти Java? Я думаю, что проблема должна быть решена где-то в другом месте. Просто обновляйте прямо в БД, а не в памяти Java, и используйте ограничения для предотвращения дублирования. – BalusC

1

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

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

класс Сотрудник класса боб и имеет такие свойства, как имя, идентификатор , назначение; карта позволяет уникальные ключи. но если вы не хотите разрешать дублирующиеся значения на вашей карте, вы должны пройти метод equals в классе 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, оба объекта являются одинаковыми.

Смежные вопросы