2015-01-09 62 views
1

每個元素應該相互配對,但只能配對一次。常規方式將列表中的每個元素進行配對

給出一個列表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但是找不到一個好方法。如果你能告訴我這個操作的基本名稱是什麼,那將是一個很大的幫助。

回答

2

有點晚了,但似乎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 
+1

這是O(n^2)幾乎在任何情況下都是不切實際的。 – dacwe 2016-01-31 21:07:30

0

如何做遞歸?第一個元素和尾部的組合,然後在列表的其餘部分進行遞歸。

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']] 
+0

我們應該再次編碼高爾夫嗎? :-) – Will 2015-01-09 20:32:06

+0

@WillP不,Pawel贏了;) – cfrick 2015-01-09 20:33:40

+1

'def p(l){l.tail()。with {e-> e.collect {[l.head(),it]} +(e? (高爾夫)記錄 – cfrick 2015-01-09 20:58:50

3

可以使用combinationstoSetsortfindAll剩下的,其大小等於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]] 
4

有可能沒有這樣的在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']] 
+0

不錯的代碼,你好哈斯克爾:D – adam0404 2015-01-09 21:13:42

+0

哈哈,謝謝:) – 2015-01-09 23:08:16

1

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'] 
] 
+2

建立一個列表在每個循環內使小貓哭泣;-) – 2015-01-10 00:10:10

+0

同意。這只是一種展示每個組合使用的方式,因爲它是由OP提到的。 :) – dmahapatro 2015-01-10 04:58:30

相關問題