Дополнительно
Как в Ruby добавить массив к другому массиву и не получить в итоге многомерный результат?
somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
Я ожидал
["some","thing","another","thing"]
448
17
Вы've получили работоспособную идею, но
#расплющить!
в неправильном месте -- его плющит его приемник, так что вы можете использовать его, чтобы включить[1, 2, ['фу', 'бар']] " в " [1,2,'фу','бар']
.Я'м, несомненно, забывая некоторые подходы, но вы можете объединения:
или prepend/конечная:
или соединение:
или добавить и плющить:
Вы можете просто использовать оператор
+
!Вы можете прочитать все о классе массивов здесь: http://ruby-doc.org/core/classes/Array.html
Самый чистый подход заключается в использовании выбора#функция concat метод; он не будет создавать новый массив (в отличие от массива#+ которая будет делать то же самое, но создать новый массив).
Прямо из документов (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat):
Так
Массив#функция concat не разогнуть многомерный массив, если он передается в качестве аргумента. Вы'll необходимо обрабатывать отдельно:
Наконец, вы можете использовать наши corelib камень (https://github.com/corlewsolutions/corelib), которые добавляет полезные помощники для рубинового базовые классы. В частности, у нас есть выбора#add_all метод, который автоматически выровнять многомерные массивы перед выполнением метода concat.
Попробуйте это, это объединит ваши массивы, удалив дубликаты
http://www.ruby-doc.org/core/classes/Array.html
Дополнительную документацию смотрите в разделе "Установить союз"
Простой метод, который работает с версии Ruby >= 2.0, но не с более старыми версиями :
Вот два способа, заметьте, в этом случае, что первый способ назначает новый массив ( переводится somearray = somearray + anotherarray )
(массив1 + массив2).уник
Таким образом, вы получите первый массив1 элементов. Вы не получите дубликаты.
Чтобы добавить
B
доA
и сохранить результат в "а":или
В любом случае, " а " становится:
но в первом случае, элементы " б "добавляются к уже существующим" а "- массив, и в последнем случае два массива объединяются вместе, и результат сохраняется в "а".
Конкретизируя @абзаца'ы ответить на единственный подходящий ответ для огромных массивов
функция concat
(+
) так быстро и не выделяет новый объект для сборки мусора при работе внутри цикла.Здесь'с эталоном:
Результаты:
Как вы можете видеть, используя "толчок" бросает ошибка:
уровне стека слишком глубоко (SystemStackError)
, когда массивы достаточно большие.Просто другой способ сделать это.
Вопрос, по сути, является "Как объединить массивы в Ruby и". Естественно, ответ должен использовать
функция concat
или+
, как упоминалось почти в каждом ответе.Естественным продолжением будет вопрос "Как выполнять построчный конкатенации 2Д массивы в Ruby и". Когда я гуглил на "Рубин объединить Матрицы" и этот вопрос был главным результат, поэтому я думал, я хотел бы оставить мой ответ на этот вопрос (невысказанный, но связанные) вопрос здесь для потомков.
В некоторых случаях вы, возможно, захотите, чтобы "объединить" и два 2D массивы строк-мудрый. Что-то вроде:
Это нечто похожее на "увеличения" а матрица. Например, я использовал эту технику, чтобы создать единую матрицу смежности для представления графа из множества более мелких матриц. Без этой техники мне пришлось бы перебирать компоненты, которые могут быть подвержены ошибкам или неприятно думать об этом. Я мог бы сделать
each_with_index
, например. Вместо этого я объединил молния и выровнять следующим образом:Если новые данные могут быть массив или скаляр, и вы хотите предотвратить новые данные, чтобы быть вложенными, если бы это был массив, оператор восклицательный знак-это круто! Он возвращает скаляр на скаляр, и распакованный список аргументов для массива.
в
в
["некая", "вещь"] + ["другая" + "вещь"]
.Я'м удивлен, никто не упомянул
уменьшить
, который хорошо работает, когда у вас есть массив массивов:Это выиграл'т удалить дублированные файлы, но
удаляет дублированные файлы.
Мне легче толкать или добавить массивов, а затем расплющить их на место, вот так:
somearray = [с"какая-то", то "вещь" и]
anotherarray = ["и еще один", то "вещь" и]
somearray + anotherarray