Часто требуется вставить разделители между элементами массива, но не перед первым и не после последнего. Для этого предназначены метод 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. Синхронная сортировка нескольких массивов

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату