2010-02-03 5 views
2

J'ai un List<HashMap<String,Object>> qui représente une base de données dans laquelle chaque enregistrement de liste est une ligne de base de données.Supprimer des doublons de la liste des entrées HashMap

J'ai 10 colonnes dans ma base de données. Il y a plusieurs lignes où les valeurs de 2 colonnes particulières sont égales. J'ai besoin de supprimer les doublons de la liste après la mise à jour de la liste avec toutes les lignes de la base de données.

Quel est le moyen efficace?

FYI - Je ne suis pas en mesure de faire distinct lors de l'interrogation de la base de données, car le nom de groupe est ajouté à un stade ultérieur au Map après le chargement de la base de données. Et puisque la colonne Id n'est pas la clé primaire, une fois que vous ajoutez GroupName au Map. Vous aurez des doublons basés sur la combinaison Id + GroupName!

J'espère que ma question est logique. Faites-moi savoir si nous avons besoin de plus de précisions.

+0

La question: quels sont ceux qui doivent être supprimés et lesquels doivent être conservés? – BalusC

+0

Pourquoi insérez-vous les doublons en premier lieu? Je veux dire, pourquoi ne vérifiez-vous pas les doublons lors de l'insertion? – 3lectrologos

+0

J'ai déjà donné la raison dans ma question.Les valeurs dans HashMap sont mises à jour après le chargement initial de la base de données. Donc, la raison pour laquelle je peux appliquer la condition en double en premier lieu. – jagamot

Répondre

3
  1. créer un comparateur qui compare HashMaps, et les compare en comparant les paires clé/valeur qui vous intéresse
  2. utilisation Collections.sort(yourlist, yourcomparator).
  3. Maintenant, toutes les cartes qui sont similaires les unes aux autres, en fonction de votre comparateur, sont adjacentes dans la liste.
  4. Créer une nouvelle liste.
  5. Parcourez votre première liste en gardant une trace de ce que vous avez vu en dernier. Si la valeur actuelle est différente de la dernière, ajoutez-la à votre nouvelle liste.
  6. Votre nouvelle liste ne doit pas contenir de doublons en fonction de votre comparateur.

Le coût de l'itération dans la liste est O (n). Le tri est O (n log n). Donc, cet algorithme est O (n log n).

Nous pourrions également trier à la volée en utilisant un TreeSet avec ce comparateur. Les insertions sont O (log n). Et nous devons le faire n fois. Nous obtenons donc O (n log n).

+0

J'espère que cette solution est également efficace même si ma liste a plus de 1 ~ millions de lignes! – jagamot

+1

Il peut être intéressant de noter qu'avec la plupart des collections, HashMap inclus, vous pouvez simplement supprimer() l'objet en double. Avec HashMap, vous passez la clé à supprimer(). Vous n'aurez donc pas besoin d'une liste ou d'une carte en double. – jonescb

+4

Que font ces 1 million de lignes dans la mémoire de Java? Pourquoi dupliquez-vous pratiquement la base de données dans la mémoire de Java? Je pense que le problème doit être résolu ailleurs. Juste mettre à jour directement dans DB au lieu de dans la mémoire de Java et faire usage de contraintes pour éviter les doublons. – BalusC

1

j'ai pris une classe d'employés et créé Carte avec Entier, objet employé comme paire clé-valeur voici ma carte

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

classe d'employés est une classe de haricots et il a des propriétés comme le nom, id ,la désignation; carte permettent des clés uniques. mais si vous ne voulez pas autoriser les valeurs en double dans votre carte, vous devez sur monter la méthode égale dans la classe de haricot.

@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; 
} 

et tout en ajoutant de la valeur clé de la carte, vous devez utiliser contient la méthode

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

containsValue appels internes méthode equals() et par conséquent vous sur course est égale méthode il vérifiera chaque valeur (objet) avec objets précédents et si les codes de hachage sont les mêmes retourne vrai signifie que les deux sont les mêmes objets.

Questions connexes