2011-06-06 6 views
5

Hola
si se busca en un HashMap<String,String> para un valor específico de un valor de par de claves, puede escribir lo siguiente:HashMap.containsKey() - ¿cómo buscar una clase?

myHashMap.containsKey(myString); 

Pero ¿Cómo puedo manejar que si la clave no es una cadena? Tengo una clase que se parece a esto:

public class Kategorie implements Comparable { 
    private String name; 

    public Kategorie() { 
     super(); 
    } 

    public Kategorie(String name) { 
     setName(name); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Object o) { 
     if (!(o instanceof Kategorie)) 
      throw new ClassCastException(); 

     Kategorie k = (Kategorie)o; 
     String name = k.getName(); 
     return this.getName().compareTo(name); 

    } 
} 

En un mapa Salvé claves y valores de este tipo "Kategorie".

mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en)); 

Más adelante en el código, quiero verificar si hay una clave con una cadena específica.

if (mapKategorieDEundEN.containsKey(searchString)) { 

... no funciona, ya que la clave no es una cadena, sino una "Kategorie", eso está claro.

Luego probé algo como esto:

if (mapKategorieDEundEN.containsKey(new Kategorie(searchString))) { 

... no funciona demasiado. Supongo que no encuentra nada porque el objeto no es el objeto "original" sino uno nuevo.

En este caso, ¿puedo usar containsKey o tengo que usar un bucle sobre HashMap?

Respuesta

5

Tu clase debe anular equals y hashCode, funcionará después de eso.

La HashMap/Hashtable coloca los elementos en "depósitos" utilizando el hashCode de la clave, por lo que un nuevo objeto que represente el mismo valor que otro y que debe considerarse como el mismo objeto debe devolver el mismo hashCode . Todas las claves que devuelven el mismo hashCode se considerarán candidatas y se invocarán iguales en ellas. Se considera una coincidencia si equals devuelve verdadero.

+0

+1: Según el javadoc para HashMap. –

+0

@downvoter, por favor explique su voto negativo de golpe y fuga. –

+0

Sí, sería bueno saber por qué mi respuesta fue downvoted. – Kaj

1

HashMap utiliza hashCode() y equals(). Tienes que implementarlos. Si no sabes cómo. Compruebe su IDE (eclipse) por lo general puede generarlos para usted.

0

Si desea acceder a sus objetos utilizando su método compareTo, no debe utilizar un mapa basado en hashCode/equals, sino un SortedMap, como TreeMap (o ConcurrentSkipListMap).

Esto tiene la ventaja adicional de que permite consultas basadas en rangos (por ejemplo, "dame todas las categorías más grandes que ésta"), pero es un poco más lenta (O (log n) en lugar de O (1)) para simple get accesos en comparación con el acceso basado en hash (con un buen código hash, no uno constante).

Para una clase de uso general, definir tanto hashCode/equals como compareTo sería sensato, entonces el usuario de la clase puede decidir qué tipo de mapa usar. (Si hay diferentes formas de clasificar sus objetos, mejor proporcione diferentes objetos del Comparador).

Como observación adicional, no debe implementar Comparable, sino Comparable<Kategorie>. Entonces su método compareTo se vería así:

public int compareTo(Kategorie k) { 
    String name = k.getName(); 
    return this.getName().compareTo(name); 
} 
Cuestiones relacionadas