Εισήχθη στους Δελφούς 2009, το TDictionary κλάση, όπως ορίζεται στα γενικά. Μονάδα συλλογών, αντιπροσωπεύει μια γενική συλλογή τύπων πίνακα hash των ζευγών κλειδί-τιμής.
Γενικοί τύποι, που εισήχθη επίσης στους Delphi 2009, σας επιτρέπουν να ορίσετε κατηγορίες που δεν καθορίζουν συγκεκριμένα τον τύπο των στοιχείων δεδομένων.
Ένα λεξικό είναι, κατά κάποιο τρόπο, παρόμοιο με μια συστοιχία. Σε ένα πίνακας εργάζεστε με μια σειρά (συλλογή) τιμών που έχουν αναπροσαρμοστεί με μια ακέραια τιμή, η οποία μπορεί να είναι οποιαδήποτε κανονική τιμή τύπου. Αυτός ο δείκτης έχει ένα χαμηλότερο και ένα ανώτερο όριο.
Σε ένα λεξικό, μπορείτε να αποθηκεύσετε κλειδιά και τιμές όπου μπορεί να είναι οποιουδήποτε τύπου.
Ο Κατασκευαστής TDictionary
Εξ ου και η δήλωση του κατασκευαστή TDictionary:
Στους Δελφούς, το TDictionary ορίζεται ως πίνακας κατακερματισμού. Οι πίνακες Hash αντιπροσωπεύουν μια συλλογή ζευγών κλειδιών και τιμών που οργανώνονται με βάση τον κώδικα κατακερματισμού του κλειδιού. Οι πίνακες Hash έχουν βελτιστοποιηθεί για αναζητήσεις (ταχύτητα). Όταν ένα ζεύγος κλειδιού-τιμής προστίθεται σε ένα πίνακα κατακερματισμού, υπολογίζεται η κατακερματισμός του κλειδιού και αποθηκεύεται μαζί με το προστιθέμενο ζεύγος.
Το TKey και το TValue, επειδή είναι γενικά, μπορεί να είναι οποιουδήποτε τύπου. Για παράδειγμα, αν οι πληροφορίες που θέλετε να αποθηκεύσετε στο λεξικό προέρχονται από κάποια βάση δεδομένων, το κλειδί σας μπορεί να είναι GUID (ή κάποια άλλη τιμή που παρουσιάζει τη μοναδική τιμή δείκτη) ενώ η τιμή μπορεί να είναι ένα αντικείμενο που έχει αντιστοιχιστεί σε μια σειρά δεδομένων στη βάση δεδομένων σας πίνακες.
Χρησιμοποιώντας TDictionary
Για λόγους απλότητας, το παρακάτω παράδειγμα χρησιμοποιεί ακέραιους αριθμούς για τους χαρακτήρες TKeys και τους χαρακτήρες για τηλεοπτικές αναφορές.
Πρώτον, δηλώνουμε το λεξικό μας καθορίζοντας ποιες θα είναι οι τύποι του TKey και του TValue:
Στη συνέχεια, το λεξικό συμπληρώνεται χρησιμοποιώντας τη μέθοδο Προσθήκη. Επειδή ένα λεξικό δεν μπορεί να έχει δύο ζεύγη με την ίδια τιμή κλειδιού, μπορείτε να χρησιμοποιήσετε τη μέθοδο ContainsKey για να ελέγξετε αν κάποιο ζεύγος με βασικές τιμές βρίσκεται ήδη μέσα στο λεξικό.
Για να καταργήσετε ένα ζευγάρι από το λεξικό, χρησιμοποιήστε τη μέθοδο Κατάργηση. Αυτή η μέθοδος δεν θα προκαλέσει προβλήματα εάν ένα ζευγάρι με ένα καθορισμένο κλειδί δεν είναι μέρος του λεξικού.
Για να περάσετε από όλα τα ζευγάρια βιδώνοντας μέσω των πλήκτρων μπορείτε να το κάνετε για βρόχο.
Χρησιμοποιήστε τη μέθοδο TryGetValue για να ελέγξετε αν κάποιο ζεύγος κλειδιού-τιμής περιλαμβάνεται στο λεξικό.
Ταξινόμηση του λεξικού
Επειδή ένα λεξικό είναι ένας πίνακας κατακερματισμού, δεν αποθηκεύει στοιχεία σε μια καθορισμένη σειρά ταξινόμησης. Για να επαναλάβετε τα κλειδιά που ταξινομούνται για να ικανοποιήσουν τις συγκεκριμένες ανάγκες σας, επωφεληθείτε από το TList - έναν γενικό τύπο συλλογής που υποστηρίζει τη διαλογή.
Ο παραπάνω κώδικας ταξινομεί τα πλήκτρα προς τα πάνω και προς τα κάτω και αρπάζει τις τιμές σαν να ήταν αποθηκευμένες στη διαλεγμένη σειρά στο λεξικό. Η φθίνουσα ταξινόμηση των τιμών βασικού τύπου τύπου ακέραιου χρησιμοποιεί τον TComparer και μια ανώνυμη μέθοδο.
Όταν τα κλειδιά και οι τιμές είναι τύπου TObject
Το παραπάνω παράδειγμα είναι απλό επειδή το κλειδί και η τιμή είναι απλοί τύποι. Μπορείτε να έχετε πολύπλοκα λεξικά όπου το κλειδί και η αξία είναι "πολύπλοκα" είδη όπως εγγραφές ή αντικείμενα.
Ακολουθεί ένα άλλο παράδειγμα:
Εδώ χρησιμοποιείται μια προσαρμοσμένη εγγραφή για το κλειδί και ένα προσαρμοσμένο αντικείμενο / κλάση χρησιμοποιείται για την τιμή.
Σημειώστε τη χρήση ενός εξειδικευμένου TObjectDictionary τάξη εδώ. Το TObjectDictionary μπορεί να χειριστεί αυτόματα τη διάρκεια ζωής των αντικειμένων.
Η τιμή του κλειδιού δεν μπορεί να είναι μηδενική, ενώ η τιμή Value μπορεί.
Όταν μια TObjectDictionary παράγεται, μια παράμετρος Ιδιοκτησία καθορίζει αν το λεξικό διαθέτει τα κλειδιά, τις τιμές ή και τα δύο - και επομένως σας βοηθά να μην έχετε διαρροές μνήμης.