Конкатенация элементов массива - PullRequest
2 голосов
/ 31 марта 2010

У меня есть два массива:

x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]

Что мне нужно, так это объединить их, чтобы в результате я получил следующее:

result = [ ["000", "#0 00 description"], ["010", "#0 10 description"],
   ["100", "#1 00 description"], ["110", "#1 10 description"] ]

Есть ли способ для этого? Или мне нужно будет использовать collect или что-то вроде этого?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 31 марта 2010

В вашем примере вы, кажется, применяете специальные правила для конкатенации цифр конкретных десятичных представлений целых чисел, что не работает простым способом (например, когда вы пишете 00, это просто 0 для интерпретатора) , Однако, предполагая, что вы имели в виду простую конкатенацию строк:

x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]
z = []
x.each do |a|
  y.each do |b|
    c = []
    a.each_index { |i| c[i] = a[i] + b[i] }
    z << c
  end
end
p z

Редактировать: Первоначально опубликованная версия вопроса содержала целые числа в качестве первых элементов каждого подмассива, к чему относится предисловие к решению. С тех пор вопрос был отредактирован, чтобы иметь строки, как предполагается здесь.

1 голос
/ 31 марта 2010

В вашем примере вы объединяете первые элементы без пробелов, но вторые элементы с пробелами. Если вы можете сделать их обоих одинаково, это может быть просто:

x.product(y).map {|a,b| a.zip(b).map(&:join)}
=> [["000", "#000 description"], ["010", "#010 description"], ["100", "#100 description"], ["110", "#110 description"]]

Если требуются различные объединения, это будет делать:

x.product(y).map {|a,b| [a[0]+b[0],a[1]+' '+b[1]]}
=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]
1 голос
/ 31 марта 2010

Вы можете использовать Array # product method:

x = [ ['0', "#0"], ['1', "#1"] ]
#=> [["0", "#0"], ["1", "#1"]]
y = [ ['00', "00 description"], ['10', "10 description"] ]
#=> [["00", "00 description"], ["10", "10 description"]]
x.product(y).map{|a1,a2| [a1[0]+a2[0], a1[1] + ' ' + a2[1]]}
#=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]

И если вам не нужны различные виды конкатенации выше (вторая вставка пробела между ними), даже:

x.product(y).map{|a1,a2|
  a1.zip(a2).map{|e|
    e.inject(&:+)
  }
}

А вот вариант без Array#product, по общему признанию менее читабельный:

x.inject([]){|a,xe|
  a + y.map{|ye|
    xe.zip(ye).map{|e|
      e.inject(&:+)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...