2015-03-12 1 views
2

Я хочу, чтобы получить декартово произведение a, b, c, d:Реализовать рубин стиль декартово произведение в Go

a = ['a1'] 
b = ['b1', 'b2'] 
c = ['c1', 'c2', 'c3'] 
d = ['d1'] 

Вот код в Ruby:

e = [b, c, d] 
print a.product(*e) 

Выход:

[ 
    ["a1", "b1", "c1", "d1"], 
    ["a1", "b1", "c2", "d1"], 
    ["a1", "b1", "c3", "d1"], 
    ["a1", "b2", "c1", "d1"], 
    ["a1", "b2", "c2", "d1"], 
    ["a1", "b2", "c3", "d1"] 
] 

Есть ли подобный пакет или функции, которые могли бы делать продукт в Голанге? Это просто упрощенная версия, на самом деле входные данные похожи на [['a1'], ['b1', 'b2'], ['c1', 'c2', 'c3], [' d1 '] , [ 'e1', ...], ...].

+0

Да: Три вложенный для петель. – Volker

+0

Вы можете посмотреть [godoc.org] (https://godoc.org/) или [go-search.org] (http://go-search.org/) для пакета матриц. –

ответ

3

Если вам нужен набор вложенных индексных циклов с неизвестным в момент компиляции, вы можете использовать такой код.

package main 

import "fmt" 

// NextIndex sets ix to the lexicographically next value, 
// such that for each i>0, 0 <= ix[i] < lens(i). 
func NextIndex(ix []int, lens func(i int) int) { 
    for j := len(ix) - 1; j >= 0; j-- { 
     ix[j]++ 
     if j == 0 || ix[j] < lens(j) { 
      return 
     } 
     ix[j] = 0 
    } 
} 

func main() { 
    e := [][]string{ 
     {"a1"}, 
     {"b1", "b2"}, 
     {"c1", "c2", "c3"}, 
     {"d1"}, 
    } 
    lens := func(i int) int { return len(e[i]) } 

    for ix := make([]int, len(e)); ix[0] < lens(0); NextIndex(ix, lens) { 
     var r []string 
     for j, k := range ix { 
      r = append(r, e[j][k]) 
     } 
     fmt.Println(r) 
    } 
} 

Выход:

[a1 b1 c1 d1] 
[a1 b1 c2 d1] 
[a1 b1 c3 d1] 
[a1 b2 c1 d1] 
[a1 b2 c2 d1] 
[a1 b2 c3 d1]