将Groovy中的LinkedHashMap转换为HashMap

7

如何在Groovy中将LinkedHashMap转换为java.util.HashMap

当我在Groovy中创建类似以下代码时,即使我像这样声明HashMap h = ....def HashMap h = ...,它也会自动创建一个LinkedHashMap

我尝试过执行以下操作:

HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

并且

def HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

h.getClass().getName() 仍然返回 LinkedHashMap


该代码涉及到IT技术。

1
只是好奇,你为什么关心正在创建的Map的实现方式呢? - Steve Kuo
4个回答

8

LinkedHashMap(链式哈希映射)是HashMap(哈希映射)的子类,因此可以像使用HashMap一样使用它。


资源:


我同意。使用HashMap的哪种实现方式并不重要。 - sbglasius

4

简短回答--地图有类似于复制构造函数的东西:

Map m = ['foo' : 'bar', 'baz' : 'quux'];
HashMap h = new HashMap(m);

所以,如果你坚持使用字面符号表示法,但你绝对需要不同的实现,这将完成工作。

但真正的问题是,为什么你在乎底层实现是什么?你甚至不应该关心它是一个HashMap。事实上,它实现了Map接口,对于几乎任何目的来说都足够了。


1
我遇到了同样的问题,即我正在尝试通过assertEquals("Checking Data Input Variable 5/9 - Define attr", ["male": 0, "female": 1], var5.define)比较一个Map,但是断言失败,因为实际类型是HashMap而预期类型是LinkedHashMap。也许我会编写自己的assertMapEquals()函数,使用您的建议... - Matthew Wise

2
他可能被可怕的Groovy-Map-Gotcha抓住了,在整个下午里,他像我一样在可能性的荒野中跌跌撞撞。
问题在于:
当使用变量字符串键时,您无法以属性符号格式(例如map.a.b.c)访问映射,这在Groovy中是意外的,因为一切通常都很简洁和美妙;--)
解决方法是将变量键用括号而不是引号包装起来。
def(a,b,c) = ['foo','bar','baz']  
Map m = [(a):[(b):[(c):1]]]  
println m."$a"."$b"."$c" // 1  
println m.foo.bar.baz // also 1

创建这样的地图将带给全世界变态者极大的乐趣:
Map m = ["$a":["$b":["$c":1]]]

希望这篇文章能够帮助其他Groovy开发者免于暂时的疯狂...
(注:该段内容为HTML格式,已保留标签)

1
 HashMap h = new HashMap() 
 h.getClass().getName();

可以正常工作。使用 [:] 符号似乎将其绑定到 LinkedHashMap。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接