如何使用MATLAB数组作为HashMap java对象的键?

10 java arrays matlab hashmap

put函数工作正常,但get函数没有.显然我不知道诀窍.

>> X = [ 1, 2, 3];
>> M = java.util.HashMap;
>> M.put(X,1);
>> M.get([1,2,3])

ans = []
Run Code Online (Sandbox Code Playgroud)

我搜索并阅读了很多帖子,但找不到解决这个问题的方法.如果有人能让我知道这个伎俩会很棒.

And*_*nke 6

我认为问题是Java原始数组没有为您提供正确的equals()和hashCode().它们使用标准的Object方法,这些方法按对象标识而不是包含的值进行比较.当使用非标量数组作为HashMap中的键时,Matlab会将它们转换为double [],但它们将是不同的Java对象,因此它们会得到这种行为.

如果您将数组值包装在一个Java对象中,该对象在将equals()和hashCode()作为键之前提供了by-value行为,那么这可能会起作用.幸运的是,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); }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以将它们包装起来并将它们用作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)
Run Code Online (Sandbox Code Playgroud)

这适用于R2008b.

>> scratch_array_keyed_hashmap
gotBack =
my value
Run Code Online (Sandbox Code Playgroud)

为了便于使用,您可以创建一个HashMap子类,该子类检查其输入键的类型,并在此按值包装器中自动包装原始数组.