2011-08-01 34 views
7

Quiero mostrar los valores en un HashMap. Un HashMap puede tener valores duplicados (pero no claves duplicadas), pero quiero mostrar un valor solo una vez.Buscar valores duplicados en Java Map?

Así que debería encontrar si el Map tiene valores duplicados. Sé que podemos iterar sobre el Map y usar el booleano de retorno de map.containsValue(value). Quiero saber si existe algún método para encontrar valores duplicados en el mapa o deberíamos escribir código yo mismo?

Respuesta

19

Una solución simple sería comparar el tamaño de su lista de valores con los valores establecidos.

// 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 
+0

esto es código válido por sí mismo, no pseudocódigo :) – Nivas

+0

Esta tecnología está muy bien. pero si quiero eliminar la media duplicada debería hacer una operación de extracción manual ¿no? – Silambarasan

+0

Sí, tendrás que hacer una operación manual. Pero si puede explicarme el escenario * exacto *, como por ejemplo cómo termina con varias claves que tienen el mismo valor y por qué quiere eliminarlas, tal vez pueda proponer una mejor solución. –

1

No existe un método proporcionado a partir de jdk1.6.

Una forma sencilla que puede hacer es

  • obtener todos los valores del mapa en una lista
  • puesto que lista en un conjunto que eliminará los duplicados
5

Ejemplo:

Map<Object, Object> map = new HashMap<Object, Object>(); 
map.put(1,2); 
map.put(3,4); 
map.put(2,2); 
map.put(5,3); 

Set<Object> uniqueValues = new HashSet<Object>(map.values()); 

System.out.println(uniqueValues); 

salida:

[2, 3, 4] 
1

Use apache commons método de biblioteca de clases

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

y comparar el tamaño de un mapa real y el mapa invertido.

0

probar este código

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
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()); 
    } 
} 
    } 
}