我有以下带有属性键和值的 HashMap:
private HashMap<String, Object> prop_values;
我需要检查它的一个实例是否等于另一个实例。过去,我只是这样做的:
if (prop_values_1.equals(prop_values_2)){
// do something
}
这一直有效,直到我得到 Object[]作为一个值。所以,我之前的表达式总是返回 false在这样的HashMap与任何 Object[]值(value)。
所以,我必须实现这个方法:
private boolean isPropValuesEquals(HashMap<String, Object> pv1, HashMap<String, Object> pv2){
boolean isEquals = true;
if (pv1 == null || pv2 == null){
return false;
}
if (!pv1.keySet().equals(pv2.keySet())){
return false;
}
for (String key : pv1.keySet()){
Object cur_pv1 = pv1.get(key);
Object cur_pv2 = pv2.get(key);
if (cur_pv1 instanceof Object[]){
if (cur_pv2 instanceof Object[]){
isEquals = Arrays.equals((Object[])cur_pv1, (Object[])cur_pv2);
} else {
return false;
}
} else {
isEquals = isEquals && cur_pv1.equals(cur_pv2);
}
if (!isEquals){
return false;
}
}
return isEquals;
}
它有效,但它似乎是某种 hack,我不确定这是实现我需要的最佳方法。
所以,这里有两个问题:
为什么 Object[].equals() 与 Arrays.equals() 不同?好像很疼。
有没有更好的方法来比较HashMap<String, Object> , 如果值可以是 Object[] ?
最佳答案
深层问题是无法覆盖数组的 equals()。为什么它一开始不写成“相同顺序的相同元素”,我不知道。它肯定是可以的(除非有一些模糊的理由不这样做;我想不出任何;如果你想检查引用相等性,你使用 ==,那么什么是有效的equals() 危害?)。
您的解决方案就是要走的路。只需考虑几个细节:
您可以使用 x.getClass().isArray() 而不是 x instanceof Object[],因此它也适用于其他数组,例如 int[](不是 Object[] 的子类)。缺点:您可能需要单独检查 x 是否为 null。
如果数组可能包含嵌套数组,请考虑使用 Arrays.deepEquals()。
原始 数组不是 Object[] 的演示:
Object a = new int[1];
System.out.println("" + (a instanceof Object[])); // false
System.out.println("" + a.getClass().isArray()); // true
另一个麻烦是,即使您发现 x 是一个数组,您仍然必须分别处理所有不同原始元素类型的情况。在 Java 的类型系统中没有办法以通用方式处理它们。当然,如果你的 map 中没有原始数组,那么你就不需要处理这种情况。
关于Java:如果值可能是 Object[],则比较 HashMap<String, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10223647/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat