2010-12-14 4 views
2

Je vais avoir deux Hashtables avec <int,string> paire. Maintenant, ils ont tous deux des valeurs en double dans chacun d'eux, et je veux fusionner les deux hashtables pour me donner des valeurs distinctes. Comment puis je faire ça!?Fusion de deux HashTable avec élimination des doublons dans Java

merci Édition # 1 Je lis le contenu du fichier à partir d'un répertoire. et stocker ces contenus sous forme de jetons dans deux tables de hachage différentes. Maintenant, j'ai besoin de les fusionner en une seule table de hachage qui me donnerait des valeurs distinctes des deux tables.

+0

Qu'est-ce qu'un "Hashtable with pair"? Aussi, êtes-vous sûr de vouloir vous débarrasser des valeurs dupliquées, ou plutôt dupliquer les clés? –

+0

désolé, je pense qu'il a été édité ... je veux dire entier, paire de cordes. et je veux me débarrasser des valeurs en double. – Maverick

+0

Non - vous n'avez pas marqué correctement les chevrons. En ce qui concerne la suppression des doublons: laquelle des clés souhaitez-vous supprimer? –

Répondre

5

Vous pouvez utiliser la méthode putAll de Hashtable pour fusionner deux tables de hachage. La hashtable passée en argument écrasera les doublons dans la hashtable d'origine.

Je n'ai pas comment deux hashage peuvent être fusionnés et ont encore distinctes valeurs. Si vous souhaitez supprimer les éléments en double de une hashtable (et les laisser dans la deuxième hashtable), faites comme suggéré dans une autre réponse, mais sans ajouter d'éléments non dupliqués à map2. Après cela, vous aurez la première table non modifiée et la seconde avec des entrées qui ne sont pas dans map1.

Une autre solution consiste à fusionner deux tables de hachage en utilisant putAll et effacer la deuxième Hashtable :)

1

Je suppose que vous voulez dire les clés en double, pas dupliquer les valeurs. De plus, étant donné que Hashtable est une implémentation de carte, je fournirai une solution de carte générique.

// assuming the maps are of type String/String 
for(Map.Entry<String, String> entry : map1.entrySet()){ 
    if(map2.containsKey(entry.getKey()){ 
     map2.remove(entry.getKey()); 
    }else{ 
     map2.put(entry.getKey(), entry.getValue()); 
    } 
} 

maintenant map2 est la version fusionnée avec tous les doublons supprimés


Mais si vous voulez une carte sans dupliquer les valeurs , qui est assez lourd à atteindre. Peut-être que vous devriez vérifier l'interface BidiMap dans apache commons/collections. Il fournit des cartes à la fois les clés et les valeurs sont uniques.


En fait, voici un moyen simple de supprimer les valeurs en double:

Collection<String> values1 = map1.values(); 
Collection<String> values2 = map2.values(); 
Collection<String> values1Copy = new ArrayList<String>(values1); 
Collection<String> values2Copy = new ArrayList<String>(values2); 
while(values1.removeAll(values2Copy)){} 
while(values2.removeAll(values1Copy)){} 

Maintenant, toutes les valeurs en double sont supprimées des deux cartes. (Supposons que vous souhaitiez supprimer complètement les dupes.Si vous souhaitez conserver une copie, utilisez les collections values1 et values2 dans les boucles while et ne prenez pas de copies.)

+0

Eh bien, c'est ce que je suis confus. Mais pour votre info. Je modifie à nouveau mes questions. – Maverick

0

Le demandeur de question d'origine a affirmé dans le commentaires qu'il veut dire valeur, pas clé. Cela rend la question incomplète. Pour avoir des valeurs dupliquées dans deux tables différentes, l'algorithme de génération de clé doit être différent. Si c'est le cas, le peu d'information qui manque à la question est la clé qu'il veut conserver? L'un de la première hashtable ou celui de la seconde?

La solution présentée ci-dessus par S.P.Floyd-seanizer est correcte, mais a besoin d'un peu de logique ajoutée s'il veut vraiment, vraiment des valeurs. cette logique supplémentaire indiquerait au code quelle touche placer la chose dans la version fusionnée.

Si le questionneur est en train d'avoir une confusion 'valeur' ​​et 'clé', alors sa solution est sur place.

+0

Eh bien, n'est-il pas possible de créer une nouvelle table de hachage, qui n'a pas de valeurs répétées des deux tables ?! – Maverick

+0

Oui, bien sûr, mais vous devez choisir quelle touche vous voulez sous. Quelqu'un ci-dessus vous a demandé si vous vouliez dire des clés en double et vous avez dit non, les valeurs en double. Cela implique qu'il peut y avoir des valeurs en double sans clés dupliquées. Dans ce cas, vous devez choisir la clé dans laquelle vous voulez que la valeur dédoublonnée apparaisse, dans votre table résultante. – jaydel