1

リストの 2 つの長いリストがあります。

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」の each{} 内でこれを行うので、「first」にマージし続ける必要があります) ある種の追加とフラット化を探していると思いますが、よくわかりません。どんな助けでも大歓迎です。

ありがとう!

4

3 に答える 3

4

もしも:

  • リストは常に一致するため、「A」レコードがfirstに 1 つあるsecond場合は に、「B」レコードが にある場合firstは に1 つ、というようになりsecondます。
  • リストは同じ順序で並べられています

次に、次の方法で回避できます。

[ first, second ].transpose()*.flatten()*.unique()
于 2013-07-25T08:09:23.937 に答える
3

これを行う1つの方法は次のとおりです。

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

Map2 番目のリストの各エントリの最初のサブエントリをキーとするテンポラリを作成し、最初のリストを繰り返し処理しながら、追加する適切なものを検索します。

例えば:

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)

おそらく、欠落している要素などに対してより堅牢にすることができます。

于 2013-07-25T01:08:21.287 に答える
0

Consider this solution, though it is somewhat brittle (e.g. when keys do not align). Also, this modifies the 'first' list as a side-effect, which is a bit of a smell.

// 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
于 2013-07-25T01:08:12.547 に答える