Блог

Ruby: Массивы

Мое знакомство с Ruby. Возможно кому-то пригодится, когда будет начинать его учить. Краткая информация о массивах.Массивы

Существует много средств для создания или инициализации массива. Одно из них – метод new этого класса:

arr = Array.new
arr = Array.new 10 => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

Можно проверить, пусто ли массив

arr.empty?

Узанать длину массива

arr.size
arr.length

Другая форма new позволит вам присвоить каждому элементу массив объект

arr = Array.new 9, 'o' => ['o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o']

Очистить массив

arr.clear

Создать массив с помощью блока

arr = Array.new(10) { |o| o=o*2 } => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Еще варианты создания массива

arr = Array.[](1, 2, 3, 4, 5, 6, 7)
arr = Array[1, 2, 3, 4, 5, 6, 7]
arr = [1, 2, 3, 4, 5, 6, 7]
arr = Array(0..9)
arr = %w[1 2 3 4 five nil]

Получить первый/последний елемент

arr = %w[1 2 3 4 five nil]
arr.first
arr.last

Проверить, присутсвует ли массив элемент с заданным значением

arr = %w[1 2 3 4 five nil]
arr.include? 'five'

возвращает true или false

Объединение массивов
Один из вариантов – при помощи оператора или метода +:

arr1 = %w[ January February March ]
arr2 = %w[ April May June ]

merge = arr1 + arr2

Второй способ, через метод <<:

merge << "July"
merge << "August" << "September"

Аналогично +, вы можете подцепить один массив к другому:

res = merge.concat(%w[October November December])

Операции над множествами

Ruby может выполнить несколько операций над множествами:
– Пересечение “&”
– Разность “-”
– Объединение “|”

Пересечение “&” создает новый массив, объединяя общие элементы двух массивов и удаляя разные элементы и дубликаты

tu = ['shop', 'make pie', 'sleep']
we = ['shop', 'make pie', 'read', 'sleep']

tu & we #=> ["shop", "make pie", "sleep"]

Разность “-” создает новый массив, удаляя элементы, которые обнаружились в обоих массивах

tu = ['shop', 'make pie', 'sleep']
we = ['shop', 'make pie', 'read', 'sleep']

we - tu 
#=> ["read"]

– Объединение “|” соединяет два массива вместе, удаляя дубликаты:

tu = ['shop', 'make pie', 'sleep']
we = ['shop', 'make pie', 'read', 'sleep']

tu | we 
#=> ["shop", "make pie", "read", "sleep"]

Уникальные элементы
Метод uniq, отдаленно связан с операциями над множествами, он создает новый массив удаляя из него дибликаты

dubl = %w[sho shop make pie sleep sleep work go work home]
dubl.uniq 
#=> ["sho", "shop", "make", "pie", "sleep", "work", "go", "home"]

Очищаем стек
Стек – это структура LIFO (last in, first out – последним пришел – первым обслужен)
Вы можете использовать массив подобно стеку, применяя методы push и pop из класса Array.
Чтобы получить такую возможность, понадобится два метода pop/push

  • pop  – удаляет последний элемент
  • push – добовляет в массива
merge = ["October", "November", "December"]
merge.pop
puts merge         #=> ["October", "November"]

merge.push "December"     #=> ["October", "November", "December"]

Сравнивание массивов
Можно воспользоваться тремя методами, это ==, <=> и eql?.

Метод == сравнивает два массива на равенств. Два массива считаются равными, если они содержат одно и то же количество элементов и каждый элемент равен соответсвующему элементу.

arr = ['element 1', 2, 3]
arr_1 = ['element 2', 5, 3]
arr_2 = ['element 1', 2, 3]
arr_3 = [3, 2, 'element 1']
arr == arr_1    #=> false
arr == arr_2    #=> true
arr == arr_3    #=> false

Метод eql? – возвращает true, если объекты одинаковы, содержимое одинаковы, а также проверяет имеют ли значения тот же тип.

arr.eql? arr_2     #=> true
arr.eql? arr_3    #=> false

Метод <=> – сравнение выполняется для каждого объекта в массвах. Два массива считаются равными, если они имеют однинаковую длину и значение каждого элемента равно значению соответвующего элемента в другом массиве. Когда сравнение выполненно, определяет больше, меньше или равны. Возвращает целое число: -1 – меньше, 0 – равно, 1 – больше.

arr <=> arr_2    #=> 0
arr <=> arr_1    #=> -1
arr <=> arr_3    #=> nil

Вставить в массив

merge = ["January", "February", "March"]
merge.insert(0, "December")

Изменяем элементы

merge = ["January", "January", "January", "January", "February", "March"]

Можно применить диапазон, чтобы изменить элементы

merge[0..2] = "Change one", "Change two", "YEAH" 
#=> ["Change one", "Change two", "YEAH"]

merge[0..1] = "GO", "HOME", "YEAH"               
#=> ["GO", "HOME", "YEAH"]

puts merge                     
#=> ["GO", "HOME", "YEAH", "YEAH", "December", "February", "March"]

merge[0..1] = "GO"                 
#=> "GO"

puts merge                     
#=> ["GO", "YEAH", "YEAH", "December", "February", "March"]

Можно проделать то же самое при помщи параметров начала и длины

merge[4, 3] = "ME", "Go" #=> ["ME", "Go"]
puts merge         
#=> ["GO", "YEAH", "YEAH", "December", "ME", "Go"]

Перевести в строку
С помощью метода to_s – как строка

merge = ["January!", "February!", "March!"]
merge.to_s    #=> "January!February!March! "

Сбить все элементы в одну строку через метод join.

merge.join      #=> "January!February!March!"
merge.join '; ' #=> "January!; February!; March!"

Удалить элементы из массива
shift/unshift – удаление/добовление аналог pop/push
shift – удаляет первый элемент
unshift – добовляет в начало массива

nums = [1,2,3,4,5]
nums.shift
p nums #=>[2,3,4,5]

nums.unshift(0,1)
p nums #=>[0,1,2,3,4,5]

Так же присутсвует метод delete – который удаляет соответсвующий объект из массива, возвращая удаленный объект, если тот найден.

nums = [1,2,3,4,5]
nums.delete 4
p nums #=> [1, 2, 3, 5]

С помощью delete_at можно удалить элемент на основе его индекса

nums.delete_at 4

Массивы и блоки
Метод each позволяет перебрать все элементы и выполнить какие-то операции с ними.

["january", "february", "march"].each { |e| puts e.capitalize }

Метод map подобен each, но вместо строки возвращает новый массив

["january", "february", "march"].map { |e| e.capitalize }

Сортировка массива

i = [1,5,3,8,14,6,7,9,0] #=> [1, 5, 3, 8, 14, 6, 7, 9, 0]
i.sort!                  #=> [0, 1, 3, 5, 6, 7, 8, 9, 14]

Изменить порядок

Порядок расположения элементов в массиве на обратный, создаст новый массив

[1,2,3,4,5].reverse #=> [5, 4, 3, 2, 1]

Многомерный массив
Это массив массивов. Вы создаете такой массив, элементы которого есть сами масивы.

[%w[Jan Feb Ma], %w[ April May June ]]

Можно превтить из многомерного в одномерный массив с помощью метода flatten

[%w[Jan Feb Ma], %w[ April May June ]].flatten    #=> ["Jan", "Feb", "Ma", "April", "May", "June"]

transpose – меняет местами столбцы со строками

a = [[1,2], [3,4], [5,6]]
a.transpose   #=> [[1, 3, 5], [2, 4, 6]]

Ссылки:
http://ru.wikibooks.org/wiki/Ruby/Справочник/Array
http://ruby-doc.org/
http://www.ruby-lang.org/en/documentation/quickstart/
http://tryruby.org/levels/2/challenges/2
http://www.tutorialspoint.com/ruby/ruby_loops.htm

Книга:
Майкл Фитцджеральд – Изучаем Ruby: 2008