List 使用groovy合并保留顺序的列表
我有两个长长的列表:List 使用groovy合并保留顺序的列表,list,groovy,List,Groovy,我有两个长长的列表: first = [[A, 2, 4, 6], [B, 1, 3, 5]...] second = [[A, 8, 10, 12], [B, 7, 9, 11]...] 要合并到(保留订单)中的 (我将在函数调用的每{}个类似于'second'的结果中执行此操作,因此我需要继续合并到'first') 我想我在寻找某种加法,加上压扁,但我不太明白。任何帮助都将不胜感激 谢谢 考虑此解决方案,尽管它有点脆弱(例如,当键不对齐时)。此外,这会作为副作用修改“第一个”列表,这有点异
first = [[A, 2, 4, 6], [B, 1, 3, 5]...]
second = [[A, 8, 10, 12], [B, 7, 9, 11]...]
要合并到(保留订单)中的
(我将在函数调用的每{}个类似于'second'的结果中执行此操作,因此我需要继续合并到'first')
我想我在寻找某种加法,加上压扁,但我不太明白。任何帮助都将不胜感激
谢谢 考虑此解决方案,尽管它有点脆弱(例如,当键不对齐时)。此外,这会作为副作用修改“第一个”列表,这有点异味
// modifies 'first' as a side-effect
def merge = { def first, def subSecond ->
def subFirst = first.find { it[0] == subSecond[0] }
if (subFirst) {
subFirst.addAll( subSecond[1..subSecond.size()-1] )
}
}
// tests
def first = null
def results = null
first = [["A",2,4,6],["B",1,3,5]]
results = []
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6],["B",1,3,5]] == first
first = [["A",2,4,6],["B",1,3,5]]
results = [ ["A",8,10,12] ]
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6,8,10,12],["B",1,3,5]] == first
first = [["A",2,4,6],["B",1,3,5]]
results = [ ["A",8,10,12],["B",7,9,11] ]
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6,8,10,12],["B",1,3,5,7,9,11]] == first
考虑此解决方案,尽管它有点脆弱(例如,当关键点不对齐时)。此外,这会作为副作用修改“第一个”列表,这有点异味
// modifies 'first' as a side-effect
def merge = { def first, def subSecond ->
def subFirst = first.find { it[0] == subSecond[0] }
if (subFirst) {
subFirst.addAll( subSecond[1..subSecond.size()-1] )
}
}
// tests
def first = null
def results = null
first = [["A",2,4,6],["B",1,3,5]]
results = []
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6],["B",1,3,5]] == first
first = [["A",2,4,6],["B",1,3,5]]
results = [ ["A",8,10,12] ]
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6,8,10,12],["B",1,3,5]] == first
first = [["A",2,4,6],["B",1,3,5]]
results = [ ["A",8,10,12],["B",7,9,11] ]
results.each { def subSecond -> merge(first,subSecond) }
assert [["A",2,4,6,8,10,12],["B",1,3,5,7,9,11]] == first
这里有一种方法:
def merge(a, b) {
tmp = b.collectEntries { [it.first(), it.tail()] }
return a.collect { it + tmp[it.first()] }
}
它生成一个临时的映射
,该映射由第二个列表中每个条目的第一个子条目设置关键字,然后在遍历第一个列表时查找要追加的适当内容
例如:
A = "A"
B = "B"
first = [[A, 2, 4, 6], [B, 1, 3, 5]]
second = [[A, 8, 10, 12], [B, 7, 9, 11]]
println merge(first, second)
它可能对缺少的元素和类似的元素更加健壮。这里有一种方法:
def merge(a, b) {
tmp = b.collectEntries { [it.first(), it.tail()] }
return a.collect { it + tmp[it.first()] }
}
它生成一个临时的映射
,该映射由第二个列表中每个条目的第一个子条目设置关键字,然后在遍历第一个列表时查找要追加的适当内容
例如:
A = "A"
B = "B"
first = [[A, 2, 4, 6], [B, 1, 3, 5]]
second = [[A, 8, 10, 12], [B, 7, 9, 11]]
println merge(first, second)
如果出现以下情况,则可能会使其对缺少的元素等更加健壮。
- 列表总是匹配的,因此如果第一个
中有一个“A”记录,那么第二个
中有一个记录,如果第一个
中有一个“B”记录,那么第二个
中有一个记录,等等
- 列表按相同的顺序排列
[ first, second ].transpose()*.flatten()*.unique()
如果:
- 列表总是匹配的,因此如果第一个
中有一个“A”记录,那么第二个
中有一个记录,如果第一个
中有一个“B”记录,那么第二个
中有一个记录,等等
- 列表按相同的顺序排列
[ first, second ].transpose()*.flatten()*.unique()
“A”和“B”是列表中的元素,还是只是为了清晰起见的符号?如果元素,它们是字符串吗?A和B是列表中的一致元素,可以用作键,但最终我只需要每个元素的第一个实例。是的,它们是字符串。是列表中的“A”和“B”元素还是为了清晰起见的一个符号?如果元素是字符串,A和B是可以用作键的列表中的一致元素,但最终我只需要每一个的第一个实例。是的,它们是字符串。谢谢答案,我不知道是否可以保证排序条件,但我会考虑这个。谢谢您的回答,我不知道我能否保证订购条件,但我会考虑这一点。