Η ταξινόμηση ήταν μια ανησυχία για τους επιστήμονες υπολογιστών από νωρίς. Υπήρχαν πολλοί αλγορίθμους που τέθηκαν σε λειτουργία και έπεσαν εκτός χρήσης και ακόμα σήμερα οι νέοι αλγόριθμοι ωθούν τα όρια της απόδοσης. Όντας μια γλώσσα υψηλού επιπέδου, δεν θα εφαρμόσετε αλγορίθμους διαλογής Ρουμπίνι αν ενδιαφέρεστε για την απόδοση και εκτός από τη διαλογή Πίνακες και άλλες συλλογές είναι ακόμα περισσότερα πράγματα που κάνει ο Ruby για εσάς.
Από τεχνική άποψη, η ταξινόμηση είναι μια εργασία που χειρίζεται η ενότητα Enumerable. Η απαρίθμηση είναι αυτό που συνδέει όλους τους τύπους συλλογών στο Ruby μαζί. Διαχειρίζεται την ανακύκλωση των συλλογών, τη διαλογή, την αναζήτηση και την εύρεση ορισμένων στοιχείων κλπ. Πώς το Enumerable sorts μια συλλογή είναι ένα κομμάτι ενός μυστηρίου, ή τουλάχιστον θα πρέπει να παραμείνει έτσι. Ο πραγματικός αλγόριθμος ταξινόμησης δεν έχει σημασία, το μόνο που πρέπει να γνωρίζετε είναι ότι τα αντικείμενα στη συλλογή συγκρίνονται χρησιμοποιώντας τον "χειριστή διαστημοπλοίου".
Ο "χειριστής διαστημοπλοίου" παίρνει δύο αντικείμενα, τα συγκρίνει και στη συνέχεια επιστρέφει -1, 0 ή 1. Αυτό είναι λίγο αόριστο, αλλά ο ίδιος ο χειριστής δεν έχει μια πολύ καλά καθορισμένη συμπεριφορά. Ας πάρουμε για παράδειγμα Αριθμητικά αντικείμενα. Αν έχετε δύο αριθμητικά αντικείμενα ένα και σι, και να αξιολογηθεί ένα <=> β, τι θα αξιολογήσει η έκφραση; Στην περίπτωση των αριθμητικών, είναι εύκολο να το πεις. Εάν το a είναι μεγαλύτερο από το b, θα είναι -1, αν είναι ίσοι θα είναι 0 και εάν το b είναι μεγαλύτερο από a, θα είναι 1. Αυτό χρησιμοποιείται για να πει τον αλγόριθμο ταξινόμησης το οποίο ένα από τα δύο αντικείμενα πρέπει να πάει πρώτα στο πίνακας. Απλά θυμηθείτε ότι αν ο αριστερός χειρός είναι να έρθει πρώτος στον πίνακα, θα πρέπει να αξιολογήσει σε -1, αν το δεξί χέρι πρέπει να είναι πρώτο θα πρέπει να είναι 1 και αν δεν πειράζει θα πρέπει να είναι 0.
Δεν ακολουθεί πάντοτε τέτοιους τακτικούς κανόνες. Τι συμβαίνει αν χρησιμοποιείτε αυτόν τον παροχέα σε δύο αντικείμενα διαφορετικού τύπου; Θα έχετε πιθανώς μια εξαίρεση. Τι συμβαίνει όταν καλείτε 1 <=> 'μαϊμού'? Αυτό θα είναι το ισοδύναμο της κλήσης 1. <=> ('Μαϊμού'), πράγμα που σημαίνει ότι καλείται η πραγματική μέθοδος αριστερά και Fixnum # <=> επιστρέφει το μηδέν αν ο ορθός χειρός δεν είναι αριθμητικός. Εάν ο χειριστής επιστρέψει μηδέν, η μέθοδος ταξινόμησης θα αυξήσει μια εξαίρεση. Επομένως, πριν από τη διαλογή συστοιχιών βεβαιωθείτε ότι περιέχουν αντικείμενα που μπορούν να ταξινομηθούν.
Δεύτερον, δεν έχει οριστεί η πραγματική συμπεριφορά του διαχειριστή του διαστημοπλοίου. Ορίζεται μόνο για μερικές από τις βασικές κατηγορίες, και για τις προσαρμοσμένες κατηγορίες σας, εξαρτάται από εσάς ό, τι θέλετε να σημαίνουν. Εάν έχετε ένα Μαθητης σχολειου μπορείτε να ταξινομήσετε τον φοιτητή με βάση το επώνυμο, το όνομα, το επίπεδο βαθμού ή ένα συνδυασμό αυτού. Συνεπώς, να γνωρίζετε ότι η συμπεριφορά του διαχειριστή του διαστημοπλοίου και η ταξινόμηση δεν είναι καλά καθορισμένη για τίποτα εκτός από τους τύπους βάσης.
Έχετε μια σειρά αριθμητικών αντικειμένων και θέλετε να τα ταξινομήσετε. Υπάρχουν δύο κύριες μέθοδοι για να γίνει αυτό: είδος και είδος!. Ο πρώτος δημιουργεί ένα αντίγραφο του πίνακα, το ταξινομεί και το επιστρέφει. Ο δεύτερος ταξινομεί τη διάταξη στη θέση της.
Αυτό είναι αρκετά αυτονόητο. Ας πάρουμε έτσι μια εγκοπή. Τι γίνεται αν δεν θέλετε να βασιστείτε στον διαχειριστή του διαστημοπλοίου; Τι γίνεται αν θέλετε μια εντελώς διαφορετική συμπεριφορά; Αυτές οι δύο μέθοδοι ταξινόμησης λαμβάνουν μια προαιρετική παράμετρο μπλοκ. Αυτό το μπλοκ παίρνει δύο παραμέτρους και πρέπει να αποδώσει τιμές ακριβώς όπως ο διαχειριστής διαστημόπλοιο κάνει: -1, 0 και 1. Έτσι, δεδομένου ενός πίνακα, θέλουμε να το ταξινομήσουμε έτσι ώστε όλες οι αξίες που διαιρούνται από τις 3 να έρθουν πρώτες, και όλες οι άλλες έρχονται μετά. Η πραγματική σειρά δεν έχει σημασία εδώ, απλώς ότι τα διαίρετα από το 3 έρχονται πρώτα.
Πως λειτουργεί αυτό? Πρώτα, σημειώστε το όρισμα block στη μέθοδο ταξινόμησης. Δεύτερον, σημειώστε τα τμήματα modulo που έγιναν στις παραμέτρους του μπλοκ και την επαναχρησιμοποίηση του διαχειριστή του διαστημικού σκάφους. Εάν το ένα είναι πολλαπλάσιο των 3, το modulo θα είναι 0, αλλιώς, θα είναι 1 ή 2. Δεδομένου ότι το 0 θα ταξινομηθεί πριν από 1 ή 2, μόνο το moduleo έχει σημασία εδώ. Η χρήση μιας παραμέτρου μπλοκ είναι ιδιαίτερα χρήσιμη σε συστοιχίες που έχουν περισσότερους από έναν τύπους στοιχείων ή όταν θέλετε να ταξινομήσετε σε προσαρμοσμένες κλάσεις που δεν διαθέτουν καθορισμένο χειριστή διαστημοπλοίου.
Υπάρχει μια ακόμη μέθοδος ταξινόμησης, που ονομάζεται ταξινόμηση κατά. Ωστόσο, θα πρέπει πρώτα να καταλάβετε τη μετάφραση των συστοιχιών και των συλλογών με το χάρτη προτού αντιμετωπίσετε το sort_by.