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.