9
votes

Trouver des valeurs dupliquées dans la carte Java?

Je veux afficher les valeurs dans un hashmap . Un hashmap peut avoir des valeurs en double (mais pas les touches en double), mais je souhaite afficher une valeur une seule fois.

Donc, je devrais déterminer si la carte a des valeurs dupliquées. Je sais que nous pouvons iTerrer sur la carte et utiliser le retour Boolean de Map.ContainsValue (valeur) . Je veux savoir si une méthode existe pour trouver des valeurs en double sur la carte ou devrions-je écrire le code moi-même?


0 commentaires

7 Réponses :


24
votes

Une solution simple serait de comparer la taille de votre liste de valeurs avec votre jeu de valeurs.

// pseudo-code
List<T> valuesList = map.values();
Set<T> valuesSet = new HashSet<T>(map.values);
// check size of both collections; if unequal, you have duplicates


2 commentaires

Cette technologie va bien. Mais si je veux supprimer la moyenne des doublons devrait faire le bon fonctionnement manuel?


Oui, vous devrez faire une opération manuelle. Mais si vous pouvez m'expliquer le scénario exactement , comme dans la façon dont vous vous retrouvez avec plusieurs clés ayant la même valeur et pourquoi vous souhaitez les supprimer, peut-être que je peux proposer une meilleure solution.



1
votes

Il n'y a pas de telle méthode fournie à partir de JDK1.6.

Un moyen simple que vous pouvez faire est

  • Obtenez toutes les valeurs de la carte dans une liste
  • mettre cette liste dans un ensemble qui supprimera les duplicates

0 commentaires

6
votes

Exemple: xxx

sortie: xxx


2 commentaires

Comment puis-je ajouter cela dans la même carte


Vous pouvez demander cela comme une nouvelle question. N'oubliez pas de décrire clairement ce que vous essayez d'atteindre, montrer le code que vous avez essayé jusqu'à présent et ce qui ne va pas exactement



1
votes

Utilisez la méthode de la classe de la bibliothèque Apache Commons

org.apache.commons.collections.MapUtils.invertMap(map)


0 commentaires

0
votes

Essayez ce code

private boolean hasDuplicates(Map<Integer, List<String>> datamap){
boolean status = false;


    Set valueset=new HashSet(datamap.values());

    if(datamap.values().size()!=valueset.size()){
    status=true;
    }
    else{
    status = false;
    }


    return status;

}


0 commentaires

0
votes
try this code but this is not optimize code :

public class HashMapDulicate {
    public static void main(String[] args) {        
        Map<String,Integer> map=new HashMap<>();
        map.put("A", 1);
        map.put("B", 1);
        map.put("C", 3);
        map.put("D", 4);


        Set set=new HashSet<>();
        List list=new ArrayList<>();

        for(Entry<String, Integer> mapVal:map.entrySet()) {

            if(!set.add(mapVal.getValue())) {
                list.add(mapVal.getValue());

            }else {
                set.add(mapVal.getValue());
            }

        }

for(Entry<String, Integer> mapVal:map.entrySet()) {

    if(list.contains(mapVal.getValue())){

        System.out.println(mapVal.getKey() +":" + mapVal.getValue());
    }
}
    }
}

0 commentaires

1
votes
public static void main(String[] args) {

        HashMap<String, Integer> map = new HashMap<>();
        map.put("abc", 2);
        map.put("def", 1);
        map.put("hij", 4);
        map.put("klm", 6);
        map.put("nop", 2);
        map.put("qrs", 2);
        map.put("tuv", 6);
        map.put("wxy", 8);
        map.put("zab", 1);
        map.put("cde", 5);
        map.put("fgh", 4);
        map.put("ijk", 3);

        HashMap<Integer, String> duplicatMap = new HashMap<>();

        Set<Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
        while(iterator.hasNext()) {
            Entry<String, Integer> entry = iterator.next();
            String key = entry.getKey();
            Integer value = entry.getValue();

            if(duplicatMap.containsKey(value)) {
                duplicatMap.put(value, duplicatMap.get(value)+", "+key);
            } else {
                duplicatMap.put(value, key);
            }
        }
        System.out.println(duplicatMap);

    } 
outPut: - {1=def, zab, 2=abc, qrs, nop, 3=ijk, 4=fgh, hij, 5=cde, 6=tuv, klm, 8=wxy}
    if you want to modify then use again EntrySet.

0 commentaires