5

オリジナルに影響を与えずにコピーを処理できるように、コピーを実行して 2 つの異なるオブジェクトを取得したいと考えています。

私はこのコードを持っています(groovy 2.0.5):

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = a
b.add([6,6,6,6,6,6])
println a
println b

それは以下を生成します:

[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6, 6]]
[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6, 6]]

b と a は実際には同じオブジェクトのようです

この方法で修正できます:

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = []

a.each {
    b.add(it)
}

b.add([6,6,6,6,6])
println a
println b

それは私の望む結果を生み出します:

[[1, 5, 2, 1, 1], [one, five, two, one, one]]
[[1, 5, 2, 1, 1], [one, five, two, one, one], [6, 6, 6, 6, 6]]

しかし、ここで、元のオブジェクトと、一意で並べ替えられた要素を持つコピーが必要な場所を見てください。

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = a

b.each {
    it.unique().sort()
}

println a
println b

それは以下を生成します:

[[1, 2, 5], [five, one, two]]
[[1, 2, 5], [five, one, two]]

今回同じ修正を試みても、うまくいきません。

def a = [[1,5,2,1,1], ["one", "five", "two", "one", "one"]]
def b = []

a.each { 
    b.add(it)
}

b.each {
    it.unique().sort()
}

println a
println b

それでも生成されます:

[[1, 2, 5], [five, one, two]]
[[1, 2, 5], [five, one, two]]

どうしたの ?

4

2 に答える 2

5

b = aセットを呼び出しbて、リストの同じインスタンス (同じリスト インスタンスを含む) にするだけです。a

a.each { b.add(it) }手段 b を指定して 2 番目のメソッドを呼び出すと、リストの別のインスタンスが指されますが、の内容bはリストのインスタンスと同じです。a

必要なものは次のようなものです:

def b = a*.collect()

b.each {
  it.unique().sort()
}

そのa*.collect()ため、各リストのリストの新しいインスタンスを作成しますa

これを 1 行で行うこともできます。

def b = a*.unique( false )*.sort( false ) 

元のリストを変更するこれらのメソッドに渡しfalse停止しunique、強制的に新しいリスト インスタンスを返すようにします。sort

(確かに、観察者は、 のおかげで既に新しいインスタンスを持っているので、 を渡すsort必要がないことに気付くでしょう)falseunique

于 2012-11-09T10:22:35.347 に答える
2

Groovy hasCollection#collectNestedは、 の再帰形式です#collect。これにより、任意の深さのリストのコピーが作成されます。バージョン 1.8.1 より前は と呼ばれてい#collectAllました。

final a = [
    'a', [ 'aa', 'ab', [ 'aba', 'abb', 'abc' ], 'ac', 'ad' ], 'b', 'c', 'd', 'e'
]

final b = a.collectNested { it }
b[0] = 'B'

final c = a.collectNested { it * 2 }
c[0] = 'C'

assert a as String ==
    '[a, [aa, ab, [aba, abb, abc], ac, ad], b, c, d, e]'

assert b as String ==
    '[B, [aa, ab, [aba, abb, abc], ac, ad], b, c, d, e]'

assert c as String ==
    '[C, [aaaa, abab, [abaaba, abbabb, abcabc], acac, adad], bb, cc, dd, ee]'
于 2012-11-10T05:35:24.327 に答える