2013-07-25 65 views
1

的名單我有列出的兩個長名單:合併列表爲了保持與常規

first = [[A, 2, 4, 6], [B, 1, 3, 5]...] 
second = [[A, 8, 10, 12], [B, 7, 9, 11]...] 

,就是想合併到(爲了保留)

first = [[A, 2, 4, 6, 8, 10, 12], [B, 1, 3, 5, 7, 9, 11]...] 

(我會做這個在每一個'second'中都有一個類似於函數調用的結果,所以我需要繼續合併爲'first') 我想我正在尋找某種加法,加上展平,但我無法完全理解它。任何幫助,將不勝感激。

謝謝!

+0

是清單中的'A'和'B'元素還是標記?如果元素,他們是字符串? –

+0

A和B是列表中可以用作鍵的一致元素,但最終我只需要每個元素的第一個實例。 –

+0

是的,他們是字符串。 –

回答

3

下面是做這件事:

def merge(a, b) { 
    tmp = b.collectEntries { [it.first(), it.tail()] } 
    return a.collect { it + tmp[it.first()] } 
} 

這使得由在第二列表中的每個條目的第一個子項鍵入一個臨時Map,然後查找適當的事在迭代第一個列表時追加。

例如:

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) 

這也許可以做出更穩健缺少的元素和這樣。

0

考慮這個解決方案,雖然它有點脆弱(例如,當鍵不對齊時)。此外,這將「第一個」列表修改爲副作用,這有點味道。

// 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 
+0

感謝您的幫助! –

4

如果:

  • 的列表總是匹配,這樣,如果有一個在first「A」的記錄有一個在second,如果有一個在first一個「B」的記錄,有一個在second
  • 清單會以相同的順序排列

然後你就可以逃脫:

[ first, second ].transpose()*.flatten()*.unique() 
+0

感謝您的回答,我不知道我是否可以保證訂購條件,但我會考慮這一點。 –