Часто требуется вставить разделители между элементами массива, но не перед первым и не после последнего. Для этого предназначены метод join
и оператор *
.
been_there = ['Veni', 'vidi', 'vici.']
journal = been_there.join(', ') # 'Veni, vidi, vici.'
letters = ['Phi','Mu','Alpha']
musicians = letters.join(' ') # 'Phi Mu Alpha'
people = ['Bob','Carol','Ted','Alice'] movie = people * ' and '
# movie равно 'Bob and Carol and Ted and Alice'
Если необходимо обрабатывать последний элемент особым образом, например вставить перед ним слово «and», это можно сделать вручную:
list = %w[A В С D Е F]
with_commas = list[0..-2]*', ' + ', and ' + list[-1]
# with_commas равно 'А, В, C, D, E, and F'
8.1.20. Обращение массива
Чтобы переставить элементы массива в обратном порядке, воспользуйтесь методами reverse
или reverse!
:
inputs = ['red', 'green', 'blue']
outputs = inputs.reverse # ['green','blue','red']
priorities = %w(eat sleep code)
priorities.reverse! # ['code','sleep','eat']
8.1.21. Удаление дубликатов из массива
Чтобы удалить из массива повторяющиеся экземпляры, воспользуйтесь методом uniq
(или его вариантом для модификации на месте uniq!
):
breakfast = %w[spam spam eggs ham eggs spam]
lunch = breakfast.uniq # ['spam','eggs','ham']
breakfast.uniq! # Массив breakfast изменился.
8.1.22. Чередование массивов
Предположим, что есть два массива и надо построить из них третий, который содержит массивы из двух элементов, взятых из соответственных позиций исходных массивов. В последних версиях Ruby модуль Enumerable
содержит метод zip
:
a = [1, 2, 3, 4]
b = ['a', 'b', 'c', 'd']
с = a.zip(b)
# с равно [[1,'а' ] , [2,'b'], [3,'с'], [4,'d']]
# Чтобы устранить вложенность, воспользуйтесь методом flatten
d = с.flatten
# d равно [1, 'а', 2, 'b', 3, 'с', 4, 'd']
8.1.23. Вычисление частоты различных значений в массиве
Для массивов нет метода count
, как для строк (чтобы подсчитать число вхождений каждого элемента). Поэтому создадим свой собственный:
class Array
def count
k=Hash.new(0)
self.each{|x| k[x]+=1 }
k
end
end
meal = %w[spam spam eggs ham eggs spam]
items = meal.count
# items равно {'ham' => 1, 'spam' => 3, 'eggs' => 2}
spams = items['spam'] # 3
Обратите внимание, что метод возвращает хэш.
8.1.24. Инвертирование массива для получения хэша
Массив нужен для того, чтобы ассоциировать целое число (индекс) с данными. А если нужно инвертировать это отношение, то есть ассоциировать данные с индексом? Иными словами, породить хэш? Это можно сделать так:
class Array
def invert
h={}
self.each_with_index{|x,i| h[x]=i}
h
end
end
a = ['red','yellow','orange']
h = a.invert # {'orange'=>2, 'yellow'=>1, 'red'=>0}
8.1.25. Синхронная сортировка нескольких массивов