2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Σχετικά έγγραφα
Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ µε JAVA

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 11: Vectors (διανύσματα)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Generics και ArrayLists

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Mεταβλητές (variables) και Σταθερές (constants)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Week. 6: Java Collections

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Αντικειµενοστρεφής Προγραµµατισµός

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Κλάσεις και Αντικείµενα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Συλλογές, Στοίβες και Ουρές

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και αντικείμενα στην Java Strings Πίνακες

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Βασικές Έννοιες Δοµών Δεδοµένων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Δομές ελέγχου ροής προγράμματος

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Αντικειμενοστρεφής Προγραμματισμός

Βασικάχαρακτηριστικάτηςγλώσσας. Πίνακες, Έλεγχος Ροής και Βρόχοι

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Βασικά Στοιχεία της Java

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Προγραµµατισµός JAVA. ρ Γεώργιος Μαυροµµάτης Πειραιάς 2004

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Wrapper Classes, Abstract Classes and Interfaces

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Οι δείκτες στη γλώσσα C

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος.

Στοιχειώδεις Δομές Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

public class ArrayStack implements Stack {

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Βασικά Στοιχεία της Java

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

API: Applications Programming Interface

Αντικειμενοστραφής Προγραμματισμός

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Transcript:

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Linear Data Structures) Ας θεωρήσουµε µία δοµή δεδοµένων το σύνολο των στοιχείων της οποίας είναι διατεταγµένο µε τέτοιο τρόπο ώστε να ισχύουν τα εξής: (α) υπάρχει ένα µόνο στοιχείο το οποίο ονοµάζεται αρχή και έχει ένα και µόνον ένα επόµενο στοιχείο (β) υπάρχει ένα µόνο στοιχείο το οποίο ονοµάζεται τέλος και έχει ένα και µόνον ένα προηγούµενο (γ) κάθε άλλο στοιχείο έχει ένα και µόνον ένα προηγούµενο και ένα και µόνον ένα επόµενο Στην περίπτωση αυτή λέµε ότι τα στοιχεία του συνόλου που αποτελούν τη δοµή δεδοµένων είναι γραµµικά διατεταγµένα και η δοµή ονοµάζεται γραµµική δοµή δεδοµένων (linear data structure). Στο κεφάλαιο αυτό εξετάζονται οι γραµµικές δοµές δεδοµένων πίνακας (array), το διάνυσµα (vector) και η συµβολοσειρά (string). Γραµµικές δοµές δεδοµένων είναι επίσης η στοίβα και η ουρά που εξετάζονται στο κεφάλαιο 3, καθώς και η συνδεδεµένη λίστα που παρουσιάζεται στο κεφάλαιο 4. 2.1 Πίνακες (Arrays) Οι πίνακες στη Java θεωρούνται αντικείµενα και εποµένως οι µεταβλητές τύπου πίνακα συµπεριφέρονται σαν µεταβλητές τύπου κλάσης, είναι δηλαδή αναφορές (references) σε αντικείµενα. Αν και δεν υπάρχει κλάση µε την ονοµασία Array αυτή υλοποιείται εσωτερικά από τη Java για λόγους αποτελεσµατικότητας. 11

Είναι σηµαντικό να διαχωρίζουµε τη µεταβλητή πίνακα και το στιγµιότυπο του πίνακα στον οποίο αναφέρεται κατά το χρόνο εκτέλεσης του προγράµµατος. Δηλώνοντας ένα πίνακα όπως παρακάτω απλά δηλώνουµε µία µεταβλητή πίνακα τα στοχεία του οποίου πρέπει να είναι ακέραιοι αριθµοί: int[ ] pin; Ισοδύναµα η παραπάνω δήλωση χρησιµοποιώντας το συντακτικό της C/C++ µπορεί να γραφεί και: int pin[ ]; Για να δηµιουργήσουµε ένα στιγµιότυπο του πίνακα πρέπει να χρησιµοποιήσουµε τον τελεστή new καθορίζοντας σε συνδυασµό και µε τον τελεστή [ ] το πλήθος των στοιχείων του πίνακα, όπως για παράδειγµα: pin = new int[10]; Με την παραπάνω δήλωση γίνεται και ανάθεση µνήµης (στην περιοχή Heap) για τα στοιχεία του πίνακα. Το µέγεθος του πίνακα µπορεί να καθοριστεί από οποιαδήποτε έκφραση ακέραιου τύπου και δεν µπορεί να αλλάζει κατά τη διάρκεια της εκτέλεσης του προγράµµατος: int j = 5; int max = 10 *j; int [ ] pin = new int[max]; Ισοδύναµα δήλωση µεταβλητής και ανάθεση µνήµης για τα στοιχεία του πίνακα µπορεί να γίνει ταυτόχρονα: int[ ] pin = new int[10]; Πολλές φορές είναι χρήσιµο να δώσουµε αρχικές τιµές στα στοιχεία ενός πίνακα, κάτι που αναφέρεται σαν αρχικοποίηση πίνακα (array initialization). Με την παρακάτω πρόταση: 12

int[ ] pin = {2,4,6,8,10,12,14,16,18,20; γίνεται ταυτόχρονα δήλωση της µεταβλητής pin, ανάθεση µνήµης και καθορισµός του µεγέθους του πίνακα και τοποθετούνται αρχικές τιµές στα δέκα στοιχεία του πίνακα. Αξίζει να παρατηρήσουµε στην παραπάνω πρόταση την µε έµµεσο τρόπο - χωρίς τη χρήση του τελεστή new - δηµιουργία ενός στιγµιότυπου της κλάσης πίνακα. Κάτι τέτοιο επιτρέπεται αποκλειστικά λόγω της εσωτερικής υλοποίησης του πίνακα από τη Java. Πρέπει να ξεχωρίζουµε την έννοια της αρχικοποίησης των στοιχείων του πίνακα από αυτήν της αρχικοποίησης µεταβλητής πίνακα. Με την παρακάτω πρόταση: char[ ] data = null; δηλώνουµε µία µεταβλητή πίνακα χαρακτήρων data η οποία έχει αρχική τιµή null. Η δυνατότητα αρχικοποίησης µεταβλητής πίνακα πηγάζει από το γεγονός ότι αυτή είναι µία µεταβλητή αναφοράς. Τα στοιχεία ενός πίνακα µπορεί να είναι οποιοδήποτε τύπου, είτε βασικού τύπου είτε τύπου κλάσης. Στη δεύτερη περίπτωση αντιµετωπίζουµε κάθε στοιχείο του πίνακα σαν µία µεταβλητή τύπου κλάσης. Επίσης τα στοιχεία ενός πίνακα µπορεί να έχουν τύπο που ορίζεται από κλάση διασύνδεσης (interface). Στην περίπτωση αυτή τα στοιχεία µπορούν να έχουν σαν τιµή τους αναφορές σε στιγµιότυπα οποιασδήποτε κλάσης υλοποιεί τη διασύνδεση ή την τιµή null. Τέλος τα στοιχεία ενός πίνακα µπορεί να έχουν τύπο που ορίζεται από αφηρηµένη (abstract) κλάση. Στην περίπτωση αυτή τα στοιχεία µπορούν να έχουν σαν τιµή τους αναφορές σε στιγµιότυπα οποιασδήποτε υπο-κλάσης της αφηρηµένης κλάσης που όµως η ίδια δεν είναι αφηρηµένη. Στην περίπτωση που τα στοιχεία του πίνακα δεν αρχικοποιηθούν άµεσα µε τη χρήση δήλωσης αυτό γίνεται έµµεσα όπως φαίνεται στον πίνακα 2.1. 13

Τύπος στοιχείων Αρχικοποίηση ακέραιος ή πραγµατικός 0 χαρακτήρας o χαρακτήρας null boolean false αντικείµενα τύπου κλάσης null Πίνακας 2.1 Για να αναφερθούµε σε ένα στοιχείο του πίνακα πρέπει να χρησιµοποιήσουµε το όνοµα της µεταβλητής του πίνακα ακολουθούµενο από τον τελεστή [ ] περιλαµβάνοντας ένα συγκεκριµένο ενδείκτη (subscript). Ο ενδείκτης του πίνακα πρέπει να είναι φυσικός αριθµός ή έκφραση: a = 3; b = 5; pin[a+b] += 2; H Java πραγµατοποιεί έλεγχο εύρους (range checking) στους ενδείκτες των πινάκων κατά τη διάρκεια της εκτέλεσης του προγράµµατος. Προσπάθεια να χρησιµοποιήσουµε ενδείκτη µε τιµή µικρότερη του µηδενός ή µεγαλύτερη ή ίση του µήκους του πίνακα οδηγεί στην κατάσταση εξαίρεσης IndexOutOfBoundExeption. Το µήκος του πίνακα (πλήθος των στοιχείων του) µπορεί να επιστραφεί µε τη χρήση του µέλους δεδοµένων (data member) length που αντιστοιχεί σε κάθε πίνακα: int i = pin.length Το µήκος του πίνακα δεν µπορεί να αλλάζει δυναµικά κατά τη διάρκεια εκτέλεσης του προγράµµατος καθώς η τιµή του length είναι τιµή µόνον ανάγνωσης: pin.length =100; // Προσοχή, λάθος! Τα στοιχεία ενός πίνακα µπορεί να είναι µε τη σειρά τους αλλοι πίνακες. Στην περίπτωση αυτή ο πίνακας ονοµάζεται πολυδιάστατος. Παραδείγµατα πολυδιάστατων πινάκων δίνονται παρακάτω: int[ ] [ ] pin2; 14

pin2 = new int [3] [4]; int[ ] [ ] pin3= { {4,5, {1,7 ; Τα στοιχεία ενός πολυδιάστατου πίνακα µπορεί να είναι πίνακες διαφορετικού µήκους όπως φαίνεται στο επόµενο παράδειγµα: int[ ] [ ] pin4; pin4 = new int[2] [ ]; pin4[0] = new int[3]; pin4[1] = new int[5]; όπου ο πίνακας pin4 αποτελείται από δύο γραµµές: ένα πίνακα µήκους 3 και ένα πίνακα µήκους 5. 2.2 Διανύσµατα (Vectors) Ενώ ένας πίνακας είναι στατικός ως προς το µέγεθός του, µε τη βοήθεια της κλάσης Vector µπορούµε να υλοποιήσουµε διανύσµατα - µία µορφή πινάκων οι οποίοι µπορούν να µεταβάλουν το µήκος τους κατά τη διάρκεια της εκτέλεσης του προγράµµατος. Ένα διάνυσµα περιέχει στοιχεία τα οποία µπορεί να είναι οποιοδήποτε τύπου και τα στοιχεία αυτά είναι προσβάσιµα όπως και στην περίπτωση του πίνακα µέσω ενός ακέραιου ενδείκτη. Η κλάση Vector ορίζεται στα πλαίσια του πακέτου java.util. Μπορούµε να δηµιουργήσουµε ένα διάνυσµα µε τρεις διαφορετικούς τρόπους: (α) Καθορίζοντας την αρχική του χωρητικότητα. Στο παράδειγµα που ακολουθεί το διάνυσµα v1 έχει αρχική χωρητικότητα µία θέση. Vector v1 = new Vector(1); Κάθε φορά που παρουσιάζεται ανάγκη χρήσης περισσότερων στοιχείων η χωρητικότητα του διανύσµατος διπλασιάζεται. 15

(β) Να µην ορίσουµε ρητά την αρχική χωρητικότητα του διανύσµατος, όπως φαίνεται στο παρακάτω παράδειγµα: Vector v2 = new Vector( ); Στην περίπτωση αυτή η αρχική χωρητικότητα καθορίζεται από το σύστηµα της Java να είναι 10 θέσεις. Και στην περίπτωση αυτή κάθε φορά που παρουσιάζεται ανάγκη χρήσης περισσότερων στοιχείων η χωρητικότητα του διανύσµατος διπλασιάζεται. (γ) Να ορίσουµε την αρχική χωρητικότητα του διανύσµατος, καθώς και το βήµα αύξησης της χωρητικότητας, όπως φαίνεται στο παρακάτω παράδειγµα: Vector v3 = new Vector(10, 5); Στην περίπτωση αυτή η αρχική χωρητικότητα είναι 10 θέσεις. Αυξάνεται κατά 5 όταν υπάρχει ανάγκη Οι βασικές λειτουργίες που αναφέρονται στα διανύσµατα υλοποιούνται από τις µεθόδους που φαίνονται στον πίνακα 2.2. Μέθοδος void addelement(object Item ) Περιγραφή προσθέτει το Item στο τέλος του διανύσµατος αυξάνοντας το µέγεθός του κατά 1. Void insertelementat(object Item, int pos) Παρεµβάλει το Item σαν νέο στοιχείο του διανύσµατος στη θέση pos void setelementat(object Item, int pos) boolean removeelement(object Item) boolean isempty Object firstelement( ) Τοποθετεί στο υπ αριθµό pos στοιχείο του διανύσµατος το Item ιαγράφει την πρώτη εµφάνιση του στοιχείου Item από το διάνυσµα Ελέγχει εάν το διάνυσµα δεν έχει καθόλου στοιχεία Επιστρέφει το πρώτο στοιχείο του διανύσµατος (αυτό που βρίσκεται στη θέση 0) Πίνακας 2.2 16

Μέθοδος Object lastelement( ) boolean contains(object Item) void trimtosize( ) int size( ) int capacity( ) Περιγραφή Επιστρέφει το τελευταίο στοιχείο του διανύσµατος Ελέγχει εάν το Item αποτελεί στοιχείο του διανύσµατος Ψαλιδίζει τη χωρητικότητα του διανύσµατος ώστε να γίνει ίση µε το τρέχον µέγεθός του Επιστρέφει το τρέχον µέγεθος του διανύσµατος Επιστρέφει τη χωρητικότητα του διανύσµατος Πίνακας 2.2 (συνέχεια) 2.3 Συµβολοσειρές (Strings) Στη Java υπάρχουν δύο κλάσεις µε τη βοήθεια των οποίων µπορούµε να δηµιουργήσουµε και να χειριστούµε συµβολοσειρές. Η κλάση String και η κλάση StringBuffer οι οποίες ορίζονται στα πλαίσια του πακέτου java.lang. Τα στιγµιότυπα και της κλάσης String και της κλάσης StringBuffer αναπαριστούν ακολουθίες Unicode χαρακτήρων. Οι συµβολοσειρές που δηµιουργούνται στα πλαίσια της κλάσης String ονοµάζονται αµετάβλητες (immutable). Ένα αντικείµενο τύπου String από τη στιγµή που θα δηµιουργηθεί δεν µπορεί να αλλάξει τιµή. Αυτό σηµαίνει ότι οποιαδήποτε λειτουργία τροποποιεί µία συµβολοσειρά οδηγεί στη δηµιουργία ενός νέου αντικειµένου. Έστω ότι δύνονται δύο συµβολοσειράς S και Q. Στον πίνακα 2.3 περιγράφονται οι µέθοδοι που αντιστοιχούν στις βασικές πράξεις του τύπου String. Μέθοδος length( ) charat(i) Περιγραφή Επιστρέφει το µήκος της συµβολοσειράς S Επιστρέφει τον χαρακτήρα που βρίσκεται στη θέση i της συµβολοσειράς S Πίνακας 2.3 17

Μέθοδος concat(q) endswith(q) equals(q) indexof(q) startswith(q) substring(i,j) Περιγραφή Επιστρέφει τη συνένωση των συµβολοσειρών S και Q χωρίς να αλλάζει την τιµή της S Ελέγχει εάν το string S τελειώνει µε το string Q Ελέγχει εάν το string S είναι ίσο µε το string Q Εάν το string Q είναι υπό-string του S και επιστρέφει τον ενδείκτη της πρώτης εµφάνισης του στο S, αλλιώς επιστρέφει -1 Επιστρέφει το υπό-string του S που αρχίζει από τη θέση i και τελειώνει στη θέση j Πίνακας 2.3 (συνέχεια) Με το πρόγραµµα που φαίνεται στο τµήµα κώδικα 1 µπορεί να ελεγχθεί η λειτουργία των βασικών πράξεων του τύπου String. class CheckString { public static void main(string arguments[ ]) { String str = "Πολύ µου αρέσει η γλώσσα προγραµµατισµού Java"; System.out.println("H συµβολοσειρά είναι: " + str); System.out.println("Το µήκος της συµβολοσειράς είναι: " + str.length( )); System.out.println("Ο χαρακτήρας στη θέση 7: " + str.charat(7)); System.out.println("Το υπο-string από 24 µέχρι 31:" + str.substring(24,31)); System.out.println("Ο ενδείκτης του χαρακτήρα x: " + str.indexof('x')); System.out.println("Ο ενδείκτης της αρχής του " + "υπο-string \"γλώσσα\": " + str.indexof("γλώσσα")); System.out.println("Το string µε κεφαλαία: " + str.touppercase()); Τµήµα κώδικα 1 Οι συµβολοσειρές που δηµιουργούνται στα πλαίσια της κλάσης StringBuffer ονοµάζονται ευµετάβλητες (mutable). Ένα αντικείµενο τύπου StringBuffer µπορεί να αλλάζει τιµή κατά τη διάρκεια της εκτέλεσης του προγράµµατος 18

Δοθείσης µίας συµβολοσειράς S και µίας Q στον παρακάτω πίνακα (πίνακας 2.4) περιγράφονται οι µέθοδοι που αντιστοιχούν στις βασικές πράξεις του τύπου StringBuffer. Μέθοδος append(q) insert(i,q) reverse( ) Περιγραφή Επιστρέφει τη συνένωση των συµβολοσειρών S και Q επιστρέφοντας το αποτέλεσµα στη συµβολοσειρά S. Επιστρέφει τη συµβολοσειρά που προκύπτει από την εισαγωγή της Q στη συµβολοσειρά S ξεκινώντας από τη θέση i της S. Tο αποτέλεσµα τροποποιεί την S. Αντιστρέφει τη συµβολοσειρά S setcharat(i,ch) Τοποθετεί τον υπ αριθµό i χαρακτήρα της συµβολοσειράς S µε ch. Tο αποτέλεσµα τροποποιεί την S. Πίνακας 2.4 2.4 Η κλάση StringTokenizer Όταν επεξεργαζόµαστε µία µεγάλη συµβολοσειρά, όπως για παράδειγµα ένα κοµµάτι κειµένου τότε είναι λογικό να τη χωρίζουµε σε επί µέρους τµήµατα - λέξεις, τα οποία ανάλογα µε τη φύση του κειµένου έχουν κάποιο συγκεκριµένο νόηµα. Τα τµήµατα αυτά ονοµάζονται tokens. Tα tokens ξεχωρίζουν µεταξύ τους µε τη βοήθεια ειδικών οριοθετών. Οι οριοθέτες αυτοί µπορεί να είναι: ένας ή περισσότεροι κενοί χαρακτήρες ειδικοί χαρακτήρες, όπως tab και newline ειδικοί χαρακτήρες αλλαγής γραµµής, όπως newline και carriage return Στη Java στα πλαίσια του πακέτου java.util ορίζεται η κλάση StringTokenizer, η οποία είναι ιδιαίτερα χρήσιµη για τον χωρισµό µίας συµβολοσειράς σε tokens και τον χειρισµό των tokens αυτών. Στα τµήµατα κώδικα 2 και 3 φαίνονται δύο παραλλαγές ενός προγράµµατος, όπου χρησιµοποιείται η κλάση StringTokenizer. 19

import java.io.*; import java.util.*; public class Setences { public static void main(string[ ] args) throws IOException { String s1; int i; BufferedReader br; br = new BufferedReader(new InputStreamReader(System.in)); s1 = br.readline( ); StringTokenizer tokens = new StringTokenizer(s1); System.out.println(tokens.countTokens( )); while (tokens.hasmoretokens( )) System.out.println(tokens.nextToken( )); Τµήµα Κώδικα 2 20

import java.io.*; import java.util.*; public class Setences2 { public static void main(string[ ] args) throws IOException { String s1; int i,j; String ArrayOfTokens[ ] = new String[20]; BufferedReader mybuffer; mybuffer = new BufferedReader(new InputStreamReader(System.in)); s1 = mybuffer.readline(); StringTokenizer tokens = new StringTokenizer(s1); i = tokens.counttokens(); System.out.println(i); j = 0; while (tokens.hasmoretokens( ) && j < ArrayOfTokens.length) { ArrayOfTokens[j] = tokens.nexttoken( ); j++; for (j=0; j<i; j++) { System.out.println(ArrayOfTokens[j]); Τµήµα κώδικα 3 21