Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
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子类来检查其输入键的类型,并自动将原始数组包装在此按值包装器中。 更多&回答... |
![]() |
![]() |