Files
SecondBrain/90 Library/Programming/Ruby - массивы.sync-conflict-20260603-110335-23DMR5O.md
T
2026-06-03 14:09:18 +03:00

4.4 KiB

status, type, tags, created, updated, title, source
status type tags created updated title source
processing knowledge
programming
ruby
2026-05-17 2026-05-26 Ruby - массивы
Ruby - массивы
Итераторы для обработки массивов Ruby

Ruby — массивы

Массив в Ruby — экземпляр класса Array. Поскольку массивы являются объектами со своими методами, работа со списками данных упрощается.

Связанные темы: Ruby - основы языка

Создание массива

a1 = [1, 2, 3]                   # литерал
a2 = %w{word1 word2}              # массив строк без кавычек
a3 = ['start', nil, 5, [1, 2]]   # разнотипные элементы, вложенный массив

a4 = Array.new                   # пустой массив
a5 = Array.new(3)                # [nil, nil, nil]
a6 = Array.new(5, "Test")        # ["Test", "Test", ...]
a7 = Array.new(5) { |i| i * i }  # [0, 1, 4, 9, 16]
a8 = Array.[](1, 'a', /^A/)      # через метод класса

Ruby поддерживает многомерные массивы с элементами разной размерности.

Индексация

a[0]   # первый элемент
a[-1]  # последний элемент
a[-2]  # предпоследний

Размер

a.size    # количество элементов
a.length  # синоним size

Поиск элементов

a.include?(obj)  # => true / false
a.index(obj)     # индекс первого вхождения или nil

Добавление элементов

a << 4          # в конец
a += [5]        # объединение
a.push(6)       # в конец (синоним: append)
a.unshift(0)    # в начало (сдвигает остальные вправо)
a.insert(2, x)  # вставить перед элементом с индексом 2

Удаление элементов

a.delete(obj)              # удалить все вхождения obj
a.delete_at(index)         # удалить по индексу
a.delete_if { |x| block }  # удалить все, подходящие под условие
a.shift                    # удалить и вернуть первый элемент
a.pop                      # удалить и вернуть последний элемент

Срезы

a[1..3]              # диапазон индексов
a[1, 3]              # начиная с индекса 1, длиной 3
a.values_at(0, 2, 4) # элементы по перечисленным индексам или диапазонам
a.first(n)           # первые n элементов
a.last(n)            # последние n элементов

Полезные методы

a.flatten    # развернуть многомерный массив в одномерный
a.flatten!   # то же, но изменяет сам массив

a.sample     # случайный элемент
a.sample(n)  # n случайных элементов

a.select { |x| block }  # массив элементов, для которых block == true

Итераторы

each перебирает элементы массива:

ary.each { |item| block }

Пример:

arr.each do |x|
  if x > 0 && x % 5 == 0
    arr_out << x
  end
end

each_index перебирает индексы:

ary.each_index { |index| block }

Похожий проход по индексам:

(0...arr.size).each do |i|
  if arr[i] > 0 && arr[i] % 5 == 0
    arr_out << arr[i]
  end
end

Поиск минимума, максимума и индексов

Императивный вариант:

a = gets.chomp.split.map { |i| i.to_i }
p a

max = min = a[0]
maxi = mini = 0

for i in 1...a.size
  if a[i] > max
    max = a[i]
    maxi = i
  end

  if a[i] < min
    min = a[i]
    mini = i
  end
end

puts "Максимальное число: #{max}, индекс: #{maxi}"
puts "Минимальное число: #{min}, индекс: #{mini}"

Через методы массива:

a = gets.chomp.split.map { |i| i.to_i }
p a

max = a.max
min = a.min
maxi = a.index(max)
mini = a.index(min)