Масиви - це поширена структура даних, з якою ми працюємо. Для роботи з масивами існує чимало методів. До них належать сортування, обернення, вставлення та багато інших.
Деякі з цих методів деструктивні, тобто вони змінюють початковий масив. Інші не деструктивні: вони повертають новий масив і не змінюють початковий.
Ось кілька найпоширеніших методів, які можна використовувати під час роботи з масивами:
Коли ми вставляємо елемент у масив, можна скористатися методом insert, який приймає індекс і елемент як аргументи.
Елемент буде вставлено за вказаним індексом, а решту масиву буде зсунуто праворуч.
Якщо індекс виходить за межі, виникне помилка IndexError.
numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]
numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)
Коли потрібно видалити конкретний елемент з масиву, можна скористатися методом delete, який приймає елемент як аргумент.
Метод повертає елемент, який було видалено.
Якщо такого елемента в масиві немає, буде повернено nil.
numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers # => [1, 3]
Коли потрібно отримати перший або останній елемент масиву, можна скористатися методами first і last.
Ці методи приймають необовʼязковий аргумент, який указує, скільки елементів повернути.
Це може покращити читабельність порівняно з використанням індексу 0 або -1 чи діапазону.
Якщо масив порожній, виникне помилка Enumerable::EmptyError.
numbers = [1, 2, 3]
numbers.first # => 1
numbers.last # => 3
numbers.first(2) # => [1, 2]
numbers.last(2) # => [2, 3]
empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)
Коли потрібно обернути масив, можна скористатися методом reverse, який повертає новий масив із елементами у зворотному порядку.
Важливо зауважити, що reverse повертає новий масив і не змінює початковий.
Якщо ми хочемо змінити початковий масив, додамо ! у кінець назви методу.
numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers # => [1, 2, 3]
numbers.reverse! # => [3, 2, 1]
numbers # => [3, 2, 1]
+)Метод додавання (<<) стає в пригоді, коли потрібно додати обʼєкти до масиву.
Однак для поєднання двох масивів можна скористатися оператором +, який повертає новий масив з елементами обох масивів.
[1, 2] + [3, 4] # => [1, 2, 3, 4]
Якщо додати масив до іншого масиву, масив буде додано як один елемент.
[1, 2] << [3, 4] # => [1, 2, [3, 4]]
Коли потрібно перевірити, чи масив порожній, можна скористатися методом empty?, який повертає true, якщо масив порожній, і false в іншому разі.
Це покращує читабельність порівняно з перевіркою довжини масиву на рівність 0.
[].empty? # => true
[1, 2, 3].empty? # => false
Коли потрібно отримати індекс елемента в масиві, можна скористатися методом index, який приймає елемент як аргумент.
Якщо такого елемента в масиві немає, буде повернено nil.
numbers = [1, 2, 3]
numbers.index(2) # => 1
Коли потрібно дізнатися кількість елементів у масиві, можна скористатися методом size.
numbers = [1, 2, 3]
numbers.size # => 3
Коли потрібно порахувати, скільки разів елемент трапляється в масиві, можна скористатися методом count.
fruits = ["apple", "banana", "apple"]
fruits.count("apple") # => 2
fruits.count("banana") # => 1
fruits.count("watermelon") # => 0
Коли потрібно відсортувати масив, можна скористатися методом sort, який повертає новий масив із відсортованими елементами.
Як і у випадку з reverse, цей метод повертає новий масив і не змінює початковий.
numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers # => [3, 2, 1]
numbers.sort! # => [1, 2, 3]
numbers # => [1, 2, 3]
Чайтана володіє дуже популярним парком розваг. У неї є лише один атракціон у самому центрі гарно облаштованої території: Найбільші американські гірки у світі(TM). Хоча тут є лише ця одна атракція, люди з усього світу приїжджають і годинами стоять у черзі, щоб мати можливість прокататися на гіперкостері Чайтани.
Для цього атракціону є дві черги, кожна з яких представлена як array:
Нас попросили написати код, щоб краще керувати відвідувачами парку. Нам потрібно якнайшвидше реалізувати наведені нижче функції, перш ніж відвідувачі (і наш начальник, Чайтана!) почнуть дратуватися.
Визначте метод ColossalCoaster.add_to_queue, який приймає 4 аргументи <express_queue>, <normal_queue>, <ticket_type>, <person_name> і повертає відповідну чергу з доданим іменем людини.
<ticket_type> має тип Int32, де 1 == express_queue, а 0 — normal_queue.<person_name> — це імʼя (як String) людини, яку потрібно додати до відповідної черги.express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]
Одна людина прийшла до парку пізно, але хоче приєднатися до черги, де чекають її друзі. Але вона гадки не має, де стоять її друзі, і немає сигналу, щоб їм зателефонувати.
Визначте метод ColossalCoaster.find_my_friend, який приймає 2 аргументи queue і friend_name та повертає позицію в черзі людини з таким іменем.
<queue> — це array з людей, що стоять у черзі.<friend_name> — це імʼя друга, індекс якого (місце в черзі) потрібно знайти.ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1
Тепер, коли їхніх друзів знайдено (у завданні №2 вище), той, хто запізнився, хотів би приєднатися до них на їхньому місці в черзі.
Визначте метод ColossalCoaster.add_with_friends, який приймає 3 аргументи queue, friend_name і person_name.
<queue> — це array з людей, що стоять у черзі.<friend_name> — це імʼя друга, на позицію якого потрібно додати людину.<person_name> — це імʼя людини, яку потрібно додати на цю позицію.Поверніть чергу, оновлену іменем того, хто запізнився.
ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
Ми щойно почули від черги, що там є дуже зла людина, яка штовхається, кричить і влаштовує сварки. Нам потрібно вигнати цього бешкетника за погану поведінку!
Визначте метод ColossalCoaster.remove_from_queue, який приймає 2 аргументи queue і person_name.
<queue> — це array з людей, що стоять у черзі.<person_name> — це імʼя людини, яку потрібно вигнати.Поверніть чергу, оновлену без імені цієї злої людини.
ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]
З адміністративних міркувань нам потрібно отримати всі імена в заданій черзі в алфавітному порядку.
Визначте метод ColossalCoaster.sorted_queue, який приймає 1 аргумент queue (array з людей, що стоять у черзі).
Метод має повертати відсортовану копію array.
ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.