Ο πίνακας είναι μια δομή δεδομένων που μπορεί να τροποποιηθεί και αποθηκεύει μια συλλογή στοιχείων ενός συγκεκριμένου τύπου. Ένας πίνακας είναι μια δομή δεδομένων με προσπέλαση ανά θέση. Το ότι οι πίνακες μπορούν να τροποποιηθούν σημαίνει ότι αν κληθεί πάνω σε έναν πίνακα μια μέθοδος που τον τροποποιεί, ο πίνακας θα τροποποιηθεί. Δηλαδή δεν δημιουργείται νέος πίνακας, αλλά τροποποιείται ο υπάρχων.
Για να δημιουργήσεις έναν πίνακα, χρησιμοποίησε τη σύνταξη δήλωσης κυριολεκτικού πίνακα ([]) και μέσα της καθόρισε τα στοιχεία του πίνακα χωρισμένα με κόμμα.
[1, 2, 3] # => [1, 2, 3]
Η Crystal συμπεραίνει τον τύπο του πίνακα από τα στοιχεία.
[1, 2, 3].class # => Array(Int32)
Ακόμα κι αν αναφέραμε παραπάνω ότι οι πίνακες είναι μια συλλογή στοιχείων ενός συγκεκριμένου τύπου, μπορείς να δημιουργήσεις έναν πίνακα με πολλαπλούς τύπους χρησιμοποιώντας τύπους ένωσης. Αυτό επιτρέπει στον πίνακα να περιέχει στοιχεία οποιουδήποτε από τους τύπους που καθορίζονται στον τύπο ένωσης. Η Crystal συμπεραίνει τον τύπο του πίνακα από τα στοιχεία.
[1, "2", 3.0] # => [1, "2", 3.0]
[1, "2", 3.0].class # => Array(Int32 | Float64 | String)
Ένας πολυδιάστατος πίνακας είναι ένας πίνακας από πίνακες.
Αυτό σημαίνει ότι κάθε στοιχείο του πίνακα είναι και το ίδιο ένας πίνακας.
Αυτό μπορεί να φανεί χρήσιμο όταν θέλεις να αποθηκεύσεις δεδομένα σε μορφή πίνακα με γραμμές και στήλες.
Για να ορίσεις έναν πολυδιάστατο πίνακα, μπορείς είτε να γράψεις τον κυριολεκτικό πίνακα από πίνακες είτε να χρησιμοποιήσεις τον κατασκευαστή Array.new.
[[1, 2], [3, 4]] # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2] # => [[1, 2]]
Για να προσθέσεις ένα στοιχείο σε έναν πίνακα, χρησιμοποίησε τον τελεστή << (προσάρτηση).
[1, 2, 3] << 4 # => [1, 2, 3, 4]
Ο τύπος του στοιχείου που θέλεις να προσθέσεις πρέπει να είναι ίδιος με τον τύπο του πίνακα· αν δεν είναι, θα πεταχτεί ένα σφάλμα.
numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]
numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String
Όπως και με τη String, μπορείς να πάρεις το μέγεθος ενός πίνακα χρησιμοποιώντας τη μέθοδο size.
[1, 2, 3].size # => 3
Ο μεταγλωττιστής δεν μπορεί να συμπεράνει τον τύπο του πίνακα όταν δημιουργείς έναν κενό πίνακα.
Επομένως, πρέπει να καθορίσεις τον τύπο του πίνακα.
Αυτό μπορεί να γίνει καθορίζοντας τον τύπο του πίνακα, χρησιμοποιώντας τη λέξη-κλειδί of, ή χρησιμοποιώντας τη σύνταξη αρχικοποίησης του πίνακα, που είναι Array(T).new.
[] of (Int32 | Float64 | String) # => []
Array(Int32 | Float64 | String).new # => []
Όπως και με τη String, μπορείς να έχεις πρόσβαση σε στοιχεία ενός πίνακα χρησιμοποιώντας τον τελεστή [] (θέση) και δίνοντάς του τη θέση του στοιχείου στο οποίο θέλεις να έχεις πρόσβαση.
Αν η θέση είναι εκτός ορίων, θα πεταχτεί ένα IndexError.
[1, 2, 3][0] # => 1
[1, 2, 3][3] # => Index out of bounds (IndexError)
Μπορείς επίσης να έχεις πρόσβαση σε στοιχεία χρησιμοποιώντας ένα διάστημα.
[1, 2, 3][0..1] # => [1, 2]
Για να δημιουργήσεις έναν πίνακα από ένα διάστημα, χρησιμοποίησε τη μέθοδο to_a.
Αυτό μπορεί να φανεί χρήσιμο όταν θέλεις να δημιουργήσεις έναν πίνακα από αριθμούς.
(1..3).to_a # => [1, 2, 3]
Για να δημιουργήσεις έναν πίνακα από μια συμβολοσειρά, χρησιμοποίησε τη μέθοδο split.
Αυτό σου επιτρέπει να χωρίσεις μια συμβολοσειρά σε έναν πίνακα από συμβολοσειρές χρησιμοποιώντας έναν διαχωριστή.
"1,2,3".split(",") # => ["1", "2", "3"]
Μπορείς επίσης να πάρεις έναν πίνακα από χαρακτήρες από μια συμβολοσειρά χρησιμοποιώντας τη μέθοδο chars.
"123".chars # => ['1', '2', '3']
Για να μετατρέψεις έναν πίνακα από Char ή String σε String, μπορείς να χρησιμοποιήσεις τη μέθοδο join, η οποία παίρνει έναν διαχωριστή ως όρισμα.
['1', '2', '3'].join(".") # => "1.2.3"
Όταν θέλεις να διαγράψεις ένα στοιχείο από το τέλος ενός πίνακα, μπορείς να χρησιμοποιήσεις τη μέθοδο pop, η οποία παίρνει ένα προαιρετικό όρισμα που καθορίζει πόσα στοιχεία θα αφαιρεθούν από το τέλος του πίνακα.
Η μέθοδος επιστρέφει το στοιχείο που αφαιρέθηκε.
Αν ο πίνακας είναι κενός, θα πεταχτεί ένα IndexError.
numbers = [1, 2, 3]
numbers.pop # => 3
numbers # => [1, 2]
empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)
Όταν θέλεις να διαγράψεις από έναν πίνακα το στοιχείο μιας συγκεκριμένης θέσης, μπορείς να χρησιμοποιήσεις τη μέθοδο delete_at, η οποία παίρνει ως όρισμα τη θέση του στοιχείου που θα αφαιρεθεί.
Αν ο πίνακας είναι κενός, θα πεταχτεί ένα IndexError.
numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers # => [1, 3]
empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)
Όταν θέλεις να τροποποιήσεις ένα στοιχείο μιας συγκεκριμένης θέσης σε έναν πίνακα, μπορείς να χρησιμοποιήσεις τον τελεστή []= (ανάθεση σε θέση), ο οποίος παίρνει ως ορίσματα τη θέση του στοιχείου που θα τροποποιηθεί και τη νέα τιμή.
Αν η θέση είναι εκτός ορίων, θα πεταχτεί ένα IndexError.
numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]
numbers[3] = 5 # => Index out of bounds (IndexError)
Σε αυτή την άσκηση θα χρειαστεί να υλοποιήσεις κάποιες μεθόδους για να χειριστείς έναν πίνακα γλωσσών προγραμματισμού.
Όρισε τη μέθοδο LanguageList.list που δεν παίρνει ορίσματα και επιστρέφει έναν κενό πίνακα του τύπου Array(String).
LanguageList.list()
# => []
Όρισε τη μέθοδο LanguageList.add που παίρνει 2 ορίσματα (έναν πίνακα γλωσσών και μια συμβολοσειρά που περιέχει μια γλώσσα).
Η μέθοδος θα πρέπει να επιστρέφει τον πίνακα με τη νέα γλώσσα προστιθέμενη στο τέλος του πίνακα.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
Όρισε τη μέθοδο LanguageList.remove που παίρνει 1 όρισμα (έναν πίνακα γλωσσών).
Η μέθοδος θα πρέπει να επιστρέφει τον πίνακα χωρίς το τελευταίο στοιχείο.
Υπέθεσε ότι ο πίνακας θα έχει πάντα τουλάχιστον ένα στοιχείο.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]
Όρισε τη συνάρτηση LanguageList.at που παίρνει 2 ορίσματα (έναν πίνακα γλωσσών και μια θέση).
Η μέθοδος θα πρέπει να επιστρέφει τη γλώσσα στη θέση ν του πίνακα.
Υπέθεσε ότι στη θέση αυτή θα υπάρχει πάντα μια γλώσσα.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"
Όρισε τη μέθοδο LanguageList.parse που παίρνει 1 όρισμα (μια συμβολοσειρά που περιέχει γλώσσες χωρισμένες με κόμμα).
Η μέθοδος θα πρέπει να επιστρέφει έναν πίνακα γλωσσών.
LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.