Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何使用MATLAB数组作为HashMap Java对象的键?

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子类来检查其输入键的类型,并自动将原始数组包装在此按值包装器中。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 01:19


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.