【问题标题】:How do I find every combination of elements如何找到元素的每个组合
【发布时间】:2020-08-03 10:48:09
【问题描述】:

我有一个元素列表:

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 组合。如何使用公式做到这一点?

【问题讨论】:

标签: javascript google-apps-script google-sheets google-sheets-formula array-formulas


【解决方案1】:

这是我的方法:

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、鲍勃和沃尔特。然后你转到下一个元素 Richard 并将他与 Bill、Bob 和 Walter 连接起来。 通过这种方式,您可以避免出现重复,例如:John - John 或 John - Richard 和 Richard - John。 forEach 方法可帮助您实现这种迭代方法。

参考资料:

forEach()

【讨论】:

  • 那个对我有用。非常感谢你!其他解决方案由于某种原因不起作用,即使我完全一样。
  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • @TheMaster 你是对的!我为我的答案和参考添加了更多解释。
【解决方案2】:

如何使用公式做到这一点?

使用:

=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))))

【讨论】:

  • 你能简单解释一下代码吗?骨头上的一点肉会有很长的路要走。
  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案3】:

如果 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)&lt;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 将二维矩阵转换为连接名称:
            John☤Rich   John☤Bill   John☤Bob    John☤Walt
                        Rich☤Bill   Rich☤Bob    Rich☤Walt
                                    Bill☤Bob    Bill☤Walt
                                                Bob☤Walt
  • FLATTEN 矩阵,使用 QUERY 和 SPLIT 将连接名称删除空格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多