[英]How do I find every combination of n 5-length arrays without repeating row or column
[英]How do I find every combination of elements
我有一個元素列表:
John
Richard
Bill
Bob
Walter
我想做一些事情來將它們的所有可能組合放在兩列中,不包括重復項。 這是示例:
A B
John Richard
John Bill
John Bob
John Walter
Richard Bill
Richard Bob
Richard Walter
Bill Bob
Bill Walter
Bob Walter
如您所見,我排除了 John-John 和 Walter-Bill,因為已經存在 Bill-Walter 組合。 我如何使用公式來做到這一點?
這是我的方法:
function myFunction() {
var names = ['John', 'Richard', 'Bill', 'Bob', 'Walter'];
var result = []
var sheet = SpreadsheetApp.getActive().getSheetByName("sheet1")
names.forEach( (element, index) => {
names.slice(index+1,names.length).forEach ( (rest) => {
result.push([element,rest])
})})
sheet.getRange(2,1,result.length,result[0].length).setValues(result);
}
解釋:
本質上,您遍歷名稱列表。 從每個元素開始,您只連接下一個元素。 例如, John是姓名列表中的第一個元素,您將John與Richard 、 Bill 、 Bob和Walter連接起來。 然后你 go 到下一個元素是Richard並且你將他與Bill , Bob和Walter連接起來。 通過這種方式,您可以避免重復: John - John或John - Richard和Richard - John 。 forEach方法可幫助您實現這種迭代方法。
參考:
我如何使用公式來做到這一點?
采用:
=ARRAYFORMULA(SORT(UNIQUE(QUERY(IF(
TRANSPOSE(SPLIT(REPT(CONCATENATE(A1:A&CHAR(9)), COUNTA(A1:A)), CHAR(9)))>
TRANSPOSE(SPLIT(CONCATENATE(REPT(A1:A&CHAR(9), COUNTA(A1:A))), CHAR(9))), {
TRANSPOSE(SPLIT(REPT(CONCATENATE(A1:A&CHAR(9)), COUNTA(A1:A)), CHAR(9))),
TRANSPOSE(SPLIT(CONCATENATE(REPT(A1:A&CHAR(9), COUNTA(A1:A))), CHAR(9)))}, {
TRANSPOSE(SPLIT(CONCATENATE(REPT(A1:A&CHAR(9), COUNTA(A1:A))), CHAR(9))),
TRANSPOSE(SPLIT(REPT(CONCATENATE(A1:A&CHAR(9)), COUNTA(A1:A)), CHAR(9)))}),
"where Col1<>Col2", 0))))
如果 A1:A5 包含名稱,
=ARRAYFORMULA(SPLIT(QUERY(
FLATTEN(
IF(SEQUENCE(COUNTA(A1:A5))<TRANSPOSE(SEQUENCE(COUNTA(A1:A5))),
A1:A5& "☤" & TRANSPOSE(A1:A5)
,)
),
"where Col1 is not null",0),"☤"))
SEQUENCE(5)<TRANSPOSE(SEQUENCE(5)
創建一個“真正的”上三角(對角線為 0)二維矩陣0 1 1 1 1
0 0 1 1 1
0 0 0 1 1
0 0 0 0 1
0 0 0 0 0
IF
將二維矩陣轉換為 CONCATEnated 名稱: John☤Rich John☤Bill John☤Bob John☤Walt
Rich☤Bill Rich☤Bob Rich☤Walt
Bill☤Bob Bill☤Walt
Bob☤Walt
FLATTEN
矩陣,使用QUERY
刪除空格並SPLIT
連接的名稱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.