Οι πίνακες είναι μια συνηθισμένη δομή δεδομένων με την οποία δουλεύουμε. Γι' αυτό υπάρχει μια συλλογή μεθόδων που μπορείς να χρησιμοποιήσεις για να δουλέψεις με πίνακες. Περιλαμβάνει ταξινόμηση, αντιστροφή, εισαγωγή και πολλά άλλα.
Κάποιες από αυτές τις μεθόδους είναι καταστροφικές, που σημαίνει ότι τροποποιούν τον αρχικό πίνακα. Άλλες είναι μη καταστροφικές, δηλαδή επιστρέφουν έναν νέο πίνακα και δεν τροποποιούν τον αρχικό.
Ορίστε μερικές από τις πιο συνηθισμένες μεθόδους που μπορείς να χρησιμοποιήσεις όταν δουλεύεις με πίνακες:
Όταν εισάγεις ένα στοιχείο σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο 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]
+)Η μέθοδος append (<<) είναι χρήσιμη όταν θέλεις να προσθέσεις αντικείμενα σε έναν πίνακα.
Ωστόσο, όταν συνδυάζεις δύο πίνακες, μπορείς να χρησιμοποιήσεις τον τελεστή +, ο οποίος επιστρέφει έναν νέο πίνακα με τα στοιχεία και των δύο πινάκων.
[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]
Η Chaitana έχει ένα πολύ δημοφιλές λούνα παρκ. Έχει μόνο ένα παιχνίδι, ακριβώς στο κέντρο ενός πανέμορφα διαμορφωμένου τοπίου: το Μεγαλύτερο Τρενάκι του Λούνα Παρκ στον Κόσμο(TM). Αν και υπάρχει μόνο αυτό το ένα αξιοθέατο, άνθρωποι ταξιδεύουν από όλο τον κόσμο και στέκονται στην ουρά για ώρες, μόνο και μόνο για την ευκαιρία να κάνουν βόλτα με το hypercoaster της Chaitana.
Υπάρχουν δύο ουρές για αυτό το παιχνίδι, και καθεμία αναπαρίσταται ως array:
Σου ζητήθηκε να γράψεις κώδικα για να διαχειρίζεσαι καλύτερα τους επισκέπτες του πάρκου. Πρέπει να υλοποιήσεις τις παρακάτω συναρτήσεις το συντομότερο δυνατό, πριν οι επισκέπτες (και το αφεντικό σου, η Chaitana!) αρχίσουν να γκρινιάζουν.
Όρισε τη μέθοδο 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.