我需要一种在groovy中使用与+;

我需要一种在groovy中使用与+;,groovy,map,Groovy,Map,注意:这可以很容易地作为方法调用或运算符重写来完成,我正在寻找一个内在的单行解决方案,我不必在库中随身携带 组合(添加)贴图时,会得到如下结果: println [a:1,c:3] + [a:2] // prints {a=2, c=3} 我似乎一直需要更多的结果,比如: {a=[1, 2], c=[3]} 换言之,它将来自贴图中相同键的所有值组合在一起 有没有一个操作符或简单的函数调用可以做到这一点,因为自己做这件事似乎总是会让我的步子有点停顿。似乎*操作符可以很好地完成这项工作,但事实并

注意:这可以很容易地作为方法调用或运算符重写来完成,我正在寻找一个内在的单行解决方案,我不必在库中随身携带

组合(添加)贴图时,会得到如下结果:

println [a:1,c:3] + [a:2]
// prints {a=2, c=3}
我似乎一直需要更多的结果,比如:

{a=[1, 2], c=[3]}
换言之,它将来自贴图中相同键的所有值组合在一起

有没有一个操作符或简单的函数调用可以做到这一点,因为自己做这件事似乎总是会让我的步子有点停顿。似乎*操作符可以很好地完成这项工作,但事实并非如此


有没有一个简单的方法可以做到这一点?

我什么都没想到,所以我从以下内容开始竞标:

m1 = [a:1, c:666]; m2 = [a:2, b:42]
result = [:].withDefault{[]}
[m1,m2].each{ it.each{ result[it.key] << it.value } }
assert result == [a:[1,2], b:[42], c:[666]]
m1=[a:1,c:666];m2=[a:2,b:42]
结果=[:]。默认值为{[]}

[m1,m2]。每个{it.each{result[it.key]我什么都没想到,所以我从以下内容开始竞标:

m1 = [a:1, c:666]; m2 = [a:2, b:42]
result = [:].withDefault{[]}
[m1,m2].each{ it.each{ result[it.key] << it.value } }
assert result == [a:[1,2], b:[42], c:[666]]
m1=[a:1,c:666];m2=[a:2,b:42]
结果=[:]。默认值为{[]}
[m1,m2]。每个{it.each{result[it.key]另一个备选方案(将其添加到地图上的
*
操作符)

defa=[a:1,c:10]
def b=[b:1,a:3]
Map.metaClass.multiply={Map other->
(delegate.keySet()+other.keySet()).inject([:].withDefault{[]}){m,v->
if(delegate[v]!=null){m[v]另一种选择(将其添加到地图上的
*
操作符)

defa=[a:1,c:10]
def b=[b:1,a:3]
Map.metaClass.multiply={Map other->
(delegate.keySet()+other.keySet()).inject([:].withDefault{[]}){m,v->

如果(委托[v]!=null){m[v]你打败了我。:)我试图修改
plus
。在以前的版本中,第二个映射中不存在的元素被添加到列表中。这不是我们想要的吗?两个映射中的所有元素的组合,以及它们在列表中的值我不这么认为-换句话说,组合来自相同键的所有值的东西e映射。我认为,
plus
的行为是必需的,只是收集覆盖而不是覆盖它们的一个小例外。:)你击败了我。:)我试图修改
plus
。在以前的版本中,第二个映射中不存在的元素被添加到一个列表中。这不是我们想要的吗?所有这些元素的组合两个映射中都有e元素,它们的值都在列表中。我不这么认为——换句话说,就是将映射中相同键的所有值组合在一起的东西。我认为,
加上
的行为是必需的,除了收集覆盖而不是覆盖它们之外。:)您希望这两个映射的结果如何蒂姆的推理是正确的,我想要[a:[1,3],b:[1],c:[10]],我不想多行(我宁愿保持它的功能性风格,因为我很享受)。这似乎总是出现……我真的很惊讶它不仅仅是一个内置的问题。@cfrick奇怪的是,现在有两个人编辑了这个问题,将groovy打印结果的方式改为--而不是groovy打印结果的方式。试着在groovy中键入“[[a:1]]”,然后看到“[{a=1}]”.自从上次有人修改后,我明确地将措辞改为“Groovy displays”,我对这一编辑完全感到困惑。你希望这两个地图的结果如何?
[a:1,c:10]
[b:1,a:3]
蒂姆的推理是正确的,我希望[a:[1,3],b:[1],c:[10]]而且我不想多行(我宁愿保持功能性风格,因为我很喜欢)。这似乎一直都在出现……我真的很惊讶它不仅仅是一个内置的问题。@cfrick奇怪的是,现在有两个人编辑了这个问题,将groovy打印结果的方式改成了--而不是groovy打印结果的方式。试着键入“[[a:1]”进入groovy,看到你得到了“[{a=1}]”。自从上次有人修改后,我显式地将措辞改为“groovy displays”,我对这个编辑感到完全困惑。这与我现在所做的非常接近(事实上,几乎完全正确)。我希望得到一个像“assert[m1,m2]。regroup()=[a:[1,2],b:[42],c:[666]]这样的简单功能版本。顺便说一句,我很喜欢。默认情况下!考虑过编写一个可以重新组合一组库的库函数,但你却随身携带着一个库!这与我现在所做的非常接近(事实上,几乎完全相同)。我希望得到一个类似“assert[m1,m2].regroup()=[a:[1,2],b:[42],c:[666]]这样的简单函数版本。顺便说一句,我喜欢。默认情况下!考虑过编写一个库函数来重新组合一组,但是你却拖着一个库到处走!
def a = [ a:1, c:10 ] 
def b = [ b:1, a:3 ]

[a,b]*.collect {k,v -> [(k):v]}
      .flatten()
      .groupBy { it.keySet()[0]}
      .inject([:].withDefault{[]}) {m,v->
          m << [(v.key):v.value[v.key]]
      }
  ​​