Как найти каждую комбинацию элементов - PullRequest
2 голосов
/ 03 августа 2020

У меня есть список элементов:

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

Как видите, я высмеиваю Джона-Джона, а также Уолтера-Билла, потому что уже существует комбинация Билла-Уолтера. Как это сделать с помощью формул?

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

Как это сделать с помощью формул?

используйте:

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

введите описание изображения здесь

2 голосов
/ 03 августа 2020

Вот мой подход:

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);
}

Output

Explanation:

Essentially you iterate through the names list. Starting from each element you only concatenate with the next elements. For example, John is the first element in the name list, you concatenate John with Richard, Bill, Bob and Walter. Then you go to the next element which is Richard and you concatenate him with Bill, Bob and Walter. In this way, you avoid having duplicates like: John - John or John - Richard and Richard - John. The forEach method helps you achieve this iterative approach.

References:

forEach ()

1 голос
/ 04 августа 2020

Если 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) для создания «истинного» верхнего треугольника angular (с диагональю 0) 2D-матрицы
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
  • Преобразуйте 2D-матрицу в СВЯЗАННЫЕ имена, используя IF:
            John☤Rich   John☤Bill   John☤Bob    John☤Walt
                        Rich☤Bill   Rich☤Bob    Rich☤Walt
                                    Bill☤Bob    Bill☤Walt
                                                Bob☤Walt
  • FLATTEN матрицу, Удалите пустые пробелы, используя QUERY и SPLIT объединенные имена обратно
...