2014-11-26 2 views
-4

Я пытаюсь объединить эти массивы:Ruby: сочетающие массивы

[[1,2,3],[4,5,6],[7,8,9]] 

[["a","b"], ["c","d"], ["e","f"]] 

следующим образом:

[[1,2,3,"a","b"], [4,5,6,"c","d"], [7,8,9,"e","f"]] 

, но я не удается найти правильный ответ.

+2

Что вы пытаетесь? Вы не можете просто сбрасывать с нас требования и говорить «спасибо». Это не сайт для кодера для аренды. Вы должны опубликовать свое попытку для нас, чтобы помочь вам найти причину, по которой он не работает. – meagar

+0

Мне очень жаль meagar. Я совершенно новый для рубинов и SO. Я попробовал array1 + array2, zip и несколько других вещей, которые я нашел в сети. Я не включил их, так как я не думал, что они добавляют к моему вопросу. – user1754606

+0

Вы, конечно, не дали много времени, чтобы другие могли публиковать ответы. Увидев, что зеленая галочка вспыхивает через 15 минут, вызывает разочарование. –

ответ

6

Во-первых, вплетают массивы с Enumerable#zip, то flatten каждый элемент в новом массиве:

a = [[1,2,3],[4,5,6],[7,8,9]] 
b = [["a","b"], ["c","d"], ["e","f"]] 

a.zip(b).map(&:flatten) 
# => [[1, 2, 3, "a", "b"], [4, 5, 6, "c", "d"], [7, 8, 9, "e", "f"]] 

Если вы не знакомы, то «кренделя синтаксис двоеточие» foo(&:bar) эквивалентно foo { |x| x.bar } (на самом деле не синтаксиса, просто вызов метода под капотом).

+0

Спасибо, вот и все! – user1754606

+0

Enumerable - фантастическая коллекция методов. Любой, кто новичок в Ruby, должен потратить некоторое время на чтение того, что находится в этом сундуке. Не слышал, что это называется «prezel-colon», так что это ново. – tadman

2

Я хотел бы сделать это следующим образом:

def combine(a,b) 
    a.zip(b).map { |a,b| a+b } 
end 

a = [[1,2,3],[4,5,6],[7,8,9]] 

combine a, [[4],[5],[6]] 
    #=> [[1, 2, 3, 4], [4, 5, 6, 5], [7, 8, 9, 6]] 
combine a, [[4],[5],[[6,7],[8,9]]] 
    #=> [[1, 2, 3, 4], [4, 5, 6, 5], [7, 8, 9, [6, 7], [8, 9]]] 

flatten не дает второй результат.

1

попробовать этот

a=[[1,2,3],[4,5,6],[7,8,9]] 
b=[["a","b"], ["c","d"], ["e","f"]] 

a.zip(b).map{|x| x.flatten 1}  

Пояснение:

Метод zip ожидает переменное количество аргументов и возвращает массив массивов, которые содержат соответствующие элементы из каждой матрицы. То есть элемент-мудрый сливается с исходным массивом. Пример кода:

[4, 8, 15, 16, 23, 42].zip([42, 23, 16, 15, 8]) #=> [[4, 42], [8, 23], [15, 16], [16, 15], [23, 8], [42, nil]] 

Метод flatten возвращает одномерный массив представление массива. Он рекурсивно выбирает все элементы из внутренних массивов и выводит их из внешнего массива.

[4, [8], [15],[[[[30,[[[[6]]]]]]],15], [16, [23, 42]]].flatten #=> [4, 8, 15, 30, 6, 15, 16, 23, 42] 

так что в приведенном выше примере a.zip(b) будет возвращать [[[1, 2, 3], ["a", "b"]], [[4, 5, 6], ["c", "d"]], [[7, 8, 9], ["e", "f"]]], а затем на каждом элементе flatten применяется, который будет удален вложенный массив и дают нам требуемый результат.

+0

Hiya, это вполне может решить проблему ... но было бы хорошо, если бы вы могли отредактировать свой ответ и дать небольшое объяснение о том, как и почему оно работает :) Не забывайте - есть кучи новичков в переполнении стека , и они могли бы узнать кое-что из вашего опыта - что очевидно для вас, возможно, не так для них. –

+0

Зачем вы отправляете ответ, аналогичный тому, который был опубликован ранее? –

Смежные вопросы