Saltar al contenido

Cómo crear un HashMap con dos keys (Par de claves, valor)?

Este equipo de redactores ha estado horas buscando para darle soluciones a tus dudas, te compartimos la soluciones y deseamos servirte de mucha apoyo.

Solución:

Hay varias opciones:

2 dimensiones

Mapa de mapas

Map> map = //...
//...

map.get(2).get(5);

Envoltura key objeto

public class Key 

    private final int x;
    private final int y;

    public Key(int x, int y) 
        this.x = x;
        this.y = y;
    

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return x == key.x && y == key.y;
    

    @Override
    public int hashCode() 
        int result = x;
        result = 31 * result + y;
        return result;
    


Implementar equals() y hashCode() es crucial aquí. Entonces simplemente usa:

Map map = //...

y:

map.get(new Key(2, 5));

Table de Guayaba

Table table = HashBasedTable.create();
//...

table.get(2, 5);

Table usos mapa de mapas debajo.

N dimensiones

Note que especial Key class es el único enfoque que escala a n dimensiones. También puede considerar:

Map, V> map = //...

pero eso es terrible desde la perspectiva del rendimiento, así como la legibilidad y la exactitud (no es una manera fácil de hacer cumplir el tamaño de la lista).

Tal vez eche un vistazo a Scala donde tiene tuplas y case clases (reemplazando todo Key clase con una sola línea).

Cuando creas el tuyo propio key par de objetos, deberías enfrentarte a algunas cosas.

Primero, debe tener en cuenta la implementación hashCode() y equals(). Necesitará hacer esto.

En segundo lugar, al implementar hashCode(), asegúrese de comprender cómo funciona. El ejemplo de usuario dado

public int hashCode() 
    return this.x ^ this.y;

es en realidad una de las peores implementaciones que puedes hacer. La razón es simple: ¡tienes muchos hashes iguales! Y el hashCode() debe devolver valores int que tienden a ser raros, únicos en el mejor de los casos. Usa algo como esto:

public int hashCode() 
  return (X << 16) + Y;

Esto es rápido y devuelve hashes únicos para keys entre -2 ^ 16 y 2 ^ 16-1 (-65536 a 65535). Esto encaja en casi cualquier caso. Muy raramente estás fuera de estos límites.

En tercer lugar, al implementar equals() También sepa para qué se utiliza y sea consciente de cómo crea su keys, ya que son objetos. A menudo lo hace innecesario si las declaraciones porque siempre tendrá el mismo resultado.

Si creas keys como esto: map.put(new Key(x,y),V); nunca compararás las referencias de tu keys. Porque cada vez que quieras acceder al mapa, harás algo como map.get(new Key(x,y));. Por lo tanto tu equals() no necesita una declaración como if (this == obj). Va a nunca Ocurrir.

En vez de if (getClass() != obj.getClass()) en tus equals() mejor uso if (!(obj instanceof this)). Será válido incluso para subclases.

Entonces, lo único que necesita comparar es en realidad X e Y. Así que lo mejor equals() la implementación en este caso sería:

public boolean equals (final Object O) 
  if (!(O instanceof Key)) return false;
  if (((Key) O).X != X) return false;
  if (((Key) O).Y != Y) return false;
  return true;

Así que al final tu key la clase es así:

public class Key 

  public final int X;
  public final int Y;

  public Key(final int X, final int Y) 
    this.X = X;
    this.Y = Y;
  

  public boolean equals (final Object O) 
    if (!(O instanceof Key)) return false;
    if (((Key) O).X != X) return false;
    if (((Key) O).Y != Y) return false;
    return true;
  

  public int hashCode() 
    return (X << 16) + Y;
  


Puede dar sus índices de dimensión X y Y a nivel de acceso público, debido a que son definitivas y no contienen información sensible. No estoy 100% seguro de si private el nivel de acceso funciona correctamente en ningún caso al lanzar el Object a un Key.

Si se pregunta acerca de las finales, declaro cualquier cosa como final cuyo valor se establece en la instanciación y nunca cambia, y por lo tanto es una constante de objeto.

No puede tener un mapa hash con múltiples keys, pero puede tener un objeto que tome varios parámetros como key.

Cree un objeto llamado Índice que tome un valor xey.

public class Index 

    private int x;
    private int y;

    public Index(int x, int y) 
        this.x = x;
        this.y = y;
    

    @Override
    public int hashCode() 
        return this.x ^ this.y;
    

    @Override
    public boolean equals(Object obj) 
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Index other = (Index) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    

Entonces ten tu HashMap para obtener su resultado. 🙂

Aquí tienes las comentarios y valoraciones

Si sostienes algún reparo o forma de innovar nuestro crónica eres capaz de añadir un exégesis y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *