Creo que el problema es que las matrices primitivas de Java no proporcionan los iguales equals() y hashCode() para usted. Usan los métodos estándar de Object que se comparan por identidad de objeto en lugar de valores contenidos. Al usar matrices no escalares como claves en un HashMap, Matlab las convertirá en dobles [], pero serán objetos de Java distintos, por lo que obtendrán este comportamiento.
Si ha ajustado los valores de su matriz en un objeto Java que proporcionó un comportamiento de valor poro para equals() y hashCode() antes de usarlos como claves, esto podría funcionar. Afortunadamente, java.util.Arrays proporciona implementaciones de valor por defecto para las matrices primitivas. Solo tenemos que darles una caché en una clase contenedora que proporciona la interfaz que espera HashMap.
package test;
import java.util.Arrays;
/**
* A double[] that with by-value semantics for equals() and hashCode() so you
* can use it in HashMaps.
* In a non-toy class, you'd probably use switch statements to support arrays
* of any primitive type. In a language with real generics, you'd just template
* this.
*/
public class EqualByValueDoubleArray {
private double[] x;
public EqualByValueDoubleArray(double[] x) { this.x = x; }
public double[] getArray() { return x; };
public boolean equals(Object obj) {
if (obj instanceof EqualByValueDoubleArray) {
return Arrays.equals(this.x, ((EqualByValueDoubleArray)obj).x);
} else {
return false;
}
}
public int hashCode() { return Arrays.hashCode(x); }
}
Ahora puede envolverlos y utilizarlos como claves de Matlab.
function scratch_array_keyed_hashmap
import test.EqualByValueDoubleArray;
map = java.util.HashMap;
a = [1 2 3 4 5]';
key = EqualByValueDoubleArray(a);
map.put(key, 'my value');
% Separate key so we know it's comparing by value, not Java object identity
key2 = EqualByValueDoubleArray(a);
gotBack = map.get(key2)
Esto funciona bajo R2008b para mí.
>> scratch_array_keyed_hashmap
gotBack =
my value
Para facilitar su uso, se puede crear una subclase HashMap que comprueba el tipo de sus teclas de entrada, y automáticamente envuelto matrices primitivas en este envoltorio por valor.
estructuras
Muchas gracias. ¡Funciona a la perfección! –