Penso che il problema sia che gli array primitivi di Java non forniscono gli equals() e hashCode() corretti per voi. Usano i metodi Object standard che confrontano per identità oggetto invece di valori contenuti. Quando si usano gli array non scalari come chiavi in una HashMap, Matlab li converte in double [], ma saranno oggetti Java distinti, quindi otterranno questo comportamento.
Se i valori dell'array sono stati racchiusi in un oggetto Java che fornisce un comportamento in base al valore per equals() e hashCode() prima di utilizzarli come chiavi, ciò potrebbe funzionare. Fortunatamente, java.util.Arrays fornisce implementazioni di valore per gli array primitivi. Abbiamo solo bisogno di schiaffarli in una classe wrapper che fornisce l'interfaccia che HashMap sta aspettando.
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); }
}
Ora puoi avvolgerli e usarli come chiavi da 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)
Questo funziona per R2008b per me.
>> scratch_array_keyed_hashmap
gotBack =
my value
Per un uso più semplice, è possibile creare una sottoclasse HashMap che controllato il tipo dei suoi tasti di ingresso, ed automaticamente avvolto array primitive in questo involucro per valore.
fonte
2009-08-31 14:48:54
Grazie mille. Funziona perfettamente! –