私は問題は、Javaプリミティブ配列が正しいequals()とhashCode()を提供していないと思います。それらは、含まれている値ではなくオブジェクトのアイデンティティによって比較される標準のObjectメソッドを使用します。 HashMapの非スカラー配列をキーとして使用する場合、Matlabはそれらをdouble []に変換しますが、別個のJavaオブジェクトになるため、この動作を行います。
キーとして使用する前に、equals()およびhashCode()のバイナリ値の動作を提供するJavaオブジェクトに配列値をラップすると、これが機能する可能性があります。幸運なことに、java.util.Arraysは、プリミティブ配列の値の実装を提供します。 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); }
}
これでラップして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)
これは私のためにR2008bで動作します。
>> scratch_array_keyed_hashmap
gotBack =
my value
が容易に使用する場合には、その入力キーの種類を確認し、自動的にこの値によるラッパーでプリミティブ配列を包んHashMapのサブクラスを作成することができます。
ありがとう。それは完璧に動作します! –