登录论坛

查看完整版本 : 如何使用MATLAB数组作为HashMap Java对象的键?


poster
2019-12-10, 16:49
put函数可以正常工作,但get函数却不能。显然我不知道这个窍门。

>> X = [ 1, 2, 3]; >> M = java.util.HashMap; >> M.put(X,1); >> M.get([1,2,3]) ans = [] 我已经搜索并阅读了许多帖子,但是找不到解决此问题的方法。如果有人能让我知道窍门,那就太好了。


回答:
我认为问题在于Java基本数组无法为您提供正确的equals()和hashCode()。他们使用按对象标识而不是包含的值进行比较的标准对象方法。当在HashMap中使用非标量数组作为键时,Matlab会将其转换为double [],但是它们将是不同的Java对象,因此它们将获得这种行为。

如果将数组值包装在一个Java对象中,该对象在将它们用作键之前为equals()和hashCode()提供按值的行为,则此方法可以起作用。幸运的是,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子类来检查其输入键的类型,并自动将原始数组包装在此按值包装器中。



更多&回答... (https://stackoverflow.com/questions/1352553)