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是可以用作键的列表中的一致元素,但最终我只需要每一个的第一个实例。是的,它们是字符串。谢谢答案,我不知道是否可以保证排序条件,但我会考虑这个。谢谢您的回答,我不知道我能否保证订购条件,但我会考虑这一点。