每個元素應該相互配對,但只能配對一次。常規方式將列表中的每個元素進行配對
給出一個列表A, B, C
我想要對下面的列表:(A,B), (A,C), (B,C)
同樣4元A, B, C, D
結果應該是(A,B), (A,C), (A,D), (B,C), (B,D), (C,D)
。
我試着用每個Permutation,eachCombintation但是找不到一個好方法。如果你能告訴我這個操作的基本名稱是什麼,那將是一個很大的幫助。
每個元素應該相互配對,但只能配對一次。常規方式將列表中的每個元素進行配對
給出一個列表A, B, C
我想要對下面的列表:(A,B), (A,C), (B,C)
同樣4元A, B, C, D
結果應該是(A,B), (A,C), (A,D), (B,C), (B,D), (C,D)
。
我試着用每個Permutation,eachCombintation但是找不到一個好方法。如果你能告訴我這個操作的基本名稱是什麼,那將是一個很大的幫助。
有點晚了,但似乎subsequences會很快解決這個問題。它提供了多對,但限制結果集對於將來的讀者來說將是微不足道的和明顯的:
def pairs(def l) {
l.subsequences().findAll {it.size() == 2}
}
assert pairs(['a','b','c']) == [['a','b'], ['a','c'], ['b', 'c']] as Set
assert pairs(['a', 'b', 'c', 'd']) == [['a', 'b'], ['a', 'c'], ['a', 'd'], ['b', 'c'], ['b', 'd'], ['c', 'd']] as Set
如何做遞歸?第一個元素和尾部的組合,然後在列表的其餘部分進行遞歸。
def comb(l,r=[]) {
if (l) {
r.addAll([l.head(), l.tail()].combinations())
return comb(l.tail(), r)
}
return r
}
def m = ['a','b','c','d']
def result = comb(m)
assert result == [['a', 'b'], ['a', 'c'], ['a', 'd'], ['b', 'c'], ['b', 'd'], ['c', 'd']]
可以使用combinations
,toSet
,sort
和findAll
剩下的,其大小等於2:
def uniqueCombinations = { l ->
[l,l].combinations()*.toSet()*.sort().unique().findAll { it.size() == 2 }
}
l=[1,2,3]
assert uniqueCombinations(l) == [[1, 2], [1, 3], [2, 3]]
有可能沒有這樣的在Groovy中的一個功能,但你可以很容易地實現它:
def pairs(def elements) {
return elements.tail().collect { [elements.head(), it] } + (elements.size() > 1 ? pairs(elements.tail()) : [])
}
assert pairs(['A', 'B', 'C']) == [['A', 'B'], ['A', 'C'], ['B', 'C']]
assert pairs(['A', 'B', 'C', 'D']) == [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C'], ['B', 'D'], ['C', 'D']]
不錯的代碼,你好哈斯克爾:D – adam0404 2015-01-09 21:13:42
哈哈,謝謝:) – 2015-01-09 23:08:16
與eachCombination
它會是:
def l = ['A', 'B', 'C', 'D'], result = []
[l, l].eachCombination {
if (! (it in result*.intersect(it) || it[0] == it[1])) {
result << it.reverse()
}
}
assert result == [
['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C'], ['B', 'D'], ['C', 'D']
]
建立一個列表在每個循環內使小貓哭泣;-) – 2015-01-10 00:10:10
同意。這只是一種展示每個組合使用的方式,因爲它是由OP提到的。 :) – dmahapatro 2015-01-10 04:58:30
這是O(n^2)幾乎在任何情況下都是不切實際的。 – dacwe 2016-01-31 21:07:30