آرایهها ساختار دادهی رایجی هستند که با آنها کار میکنیم. به همین دلیل، مجموعهای از متدها وجود دارد که میتوان از آنها برای کار با آرایهها استفاده کرد. از جمله مرتبسازی، معکوسسازی، درج کردن و بسیاری موارد دیگر.
برخی از این متدها مخرب هستند، یعنی آرایهی اصلی را تغییر میدهند. برخی دیگر غیرمخرباند، یعنی یک آرایهی جدید برمیگردانند و آرایهی اصلی را تغییر نمیدهند.
در ادامه چند مورد از رایجترین متدهایی را میبینید که میتوان هنگام کار با آرایهها از آنها استفاده کرد:
وقتی میخواهید عنصری را در آرایه درج کنید، میتوانید از متد 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 را تعریف کنید که ۴ آرگومان <express_queue>, <normal_queue>, <ticket_type>, <person_name> میگیرد و صف مناسب را همراه با اسم آن شخص برمیگرداند.
<ticket_type> یک Int32 است که در آن ۱ یعنی express_queue و ۰ یعنی 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 را تعریف کنید که ۲ آرگومان queue و friend_name میگیرد و موقعیت آن شخص را در صف برمیگرداند.
<queue> یک array از افرادی است که در صف ایستادهاند.<friend_name> اسم دوستی است که باید اندیس (موقعیت در صف) او را پیدا کنید.ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1
حالا که دوستانشان پیدا شدهاند (در بخش ۲ بالا)، فرد دیررسیده میخواهد در همان موقعیتی که آنها در صف دارند به آنها بپیوندد.
متد ColossalCoaster.add_with_friends را تعریف کنید که ۳ آرگومان 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 را تعریف کنید که ۲ آرگومان queue و person_name میگیرد.
<queue> یک array از افرادی است که در صف ایستادهاند.<person_name> اسم شخصی است که باید بیرون انداخته شود.صف بهروزشده را بدون اسم آن فرد بدجنس برگردانید.
ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]
برای کارهای اداری، باید همهی اسمها را در یک صف مشخص به ترتیب الفبا مرتب کنید.
متد ColossalCoaster.sorted_queue را تعریف کنید که ۱ آرگومان میگیرد، queue (همان array از افرادی که در صف ایستادهاند).
متد باید یک نسخهی مرتبشده از array را برگرداند.
ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']