====== Πίνακες ====== Οι πίνακες στην γλώσσα προγραμματισμού **Java** ορίζονται σε αναλογία με την **C** ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται με χρήση του τελεστή **new**, σε μία δήλωση της μορφής int [] anArray; anArray = new int[5]; int anotherArray[]; anotherArray = new int[10]; ή int [] anArray = new int[5]; int anotherArray[] = new int[10]; Ο παραπάνω κώδικας ορίζει δύο πίνακες τύπου **int** μεγέθους **5** και **10** αντίστοιχα. Παρατηρήστε ότι κατά τον ορισμό του πίνακα ο τελεστής **[]** μπορεί να τοποθετηθεί πριν ή μετά το όνομα της μεταβλητής. Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά. Εναλλακτικά, μπορείτε να ορίσετε το μέγεθος του πίνακα ορίζοντας και τα περιεχόμενα του στην δήλωση ορισμού του, όπως στο παρακάτω παράδειγμα: int[] numbers = {1,2,3,4,5,6,7,8,9,10}; Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων, η αρίθμηση των στοιχείων του είναι **0-9**, όπως φαίνεται στο παρακάτω σχήμα. {{ :java:objects-tenelementarray.gif }} Μπορείτε να δείτε ενδεικτικά το παρακάτω πρόγραμμα, όπου ορίζεται ένας πίνακας ακεραίων μεγέθους 3, ο πίνακας γεμίζει με τιμές και στη συνέχεια εκτυπώνονται τα περιεχόμενα του. class ArrayDemo { public static void main(String[] args) { int[] anArray; anArray = new int[3]; anArray[0] = 100; anArray[1] = 200; anArray[2] = 300; for(int i=0; i < anArray.length; i++) { System.out.println("Element at index " + i + "/" + anArray.length+": " + anArray[i]); } int j=0; for(int element: anArray) { System.out.println("Element at index " + (j++) + "/" + anArray.length+": " + element); } } } Οι πίνακες στη Java υλοποιούνται ως αντικείμενα. __Εφόσον αρχικοποιηθεί ένας πίνακας το μέγεθος του είναι αμετάβλητο__. Κάθε αντικείμενο πίνακα έχει ένα //read-only// πεδίο **length** που αποθηκεύει το μέγεθος του πίνακα. Μέσω του πεδίου //length// μπορείτε να έχετε πρόσβαση στο μέγεθος του εκάστοτε πίνακα. ===== Πίνακες αναφορικού τύπου ===== Ας θεωρήσουμε το παρακάτω παράδειγμα κώδικα με βάση την κλάση **Rectangle** [[java:objects|της προηγούμενης ενότητας]]. public class CreateRectanglesArray { public static void main(String[] args) { Rectangle [] rectangles = new Rectangle[4]; Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(10, 20, originOne); rectangles[0] = rectOne; rectangles[1] = rectOne; rectangles[2] = new Rectangle(50, 100, new Point(5,10)); rectangles[3] = new Rectangle(20, 30, new Point(-5, 7)); int i=0; for(Rectangle rectangle : rectangles) { String str = "rectangles["+(i++)+"]: "; str = str + "("+rectangle.getOrigin().getX()+","+rectangle.getOrigin().getY()+")\t"; str = str + "width: "+rectangle.getWidth()+", height: "+rectangle.getHeight(); System.out.println(str); } rectangles[2] = rectangles[3]; } } Στον παραπάνω κώδικα στην γραμμή ''Rectangle [] rectangles = new Rectangle[4];'' δημιουργούμε ένα πίνακα από δείκτες σε αντικείμενα τύπου **Rectangle**. Αρχικά ο πίνακας έχει σε όλες τις θέσεις του την τιμή **null**. Στις επόμενες γραμμές αναθέτουμε αντικείμενα σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο ίδιο αντικείμενο στο οποίο δείχνει και η μεταβλητή **rectOne**. Εάν επιχειρήσουμε να σχεδιάσουμε το παραπάνω διάγραμμα αυτό θα δείχνει ως εξής: |Αρχικά δημιουργείται ένας πίνακας που όλα τα στοιχεία του είναι **null**. |Στη συνέχεια δημιουργούμε αντικείμενα και τα αναθέτουμε σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο αντικείμενο που δείχνει και η μεταβλητή **rectOne**. |Η ανάθεση του αντικειμένου της θέσης 3 στην θέση 2 δημιουργεί ένα αντικείμενο για το οποίο δεν υπάρχει αναφορά. Το αντικείμενο αυτό καταστρέφεται από τον [[java:objects#garbage_collection|Garbage Collector]]. | | {{ :java:createrectangletable1.png?150 |}} | {{ :java:createrectangletable2.png? |}}| {{:java:createrectangletable3.png? |}} | ===== Πίνακες δύο διαστάσεων ===== Οι πίνακες δύο διαστάσεων ορίζονται σε αναλογία με τους πίνακες μίας διάστασης ως εξής: int [][] anArray; anArray = new int[3][5]; ή int [][] anArray = new int[3][5]; Το παραπάνω παράδειγμα ορίζει ένα πίνακα διαστάσεων **3x5**. Επιπλέον, μπορούμε να έχουμε διαφορετικό αριθμό στηλών σε κάθε γραμμή του πίνακα. Δείτε το παρακάτω πρόγραμμα που περιέχει ένα πίνακα δύο διαστάσεων. Στην πρώτη γραμμή του πίνακα έχουμε 3 στοιχεία, ενώ στην 2η δύο στοιχεία. class MultiDimArrayDemo { public static void main(String[] args) { String [][] names; names = new String[3][]; names[0] = new String[3]; names[1] = new String[5]; names[2] = new String[4]; names[0][0]="Mr. "; names[0][1]="Mrs. "; names[0][2]="Ms. "; names[1][0]="Susan "; names[1][1]="Peter "; names[1][2]="Edgar "; names[1][3]="Mary "; names[1][4]="Linda "; names[2][0]="Smith"; names[2][1]="Jones"; names[2][2]="Williams"; names[2][3]="Taylor"; System.out.println(names[0][0] + names[1][1] + names[2][3] + " enters the room."); System.out.println(names[0][1] + names[1][3] + names[2][2] + " leaves the room."); } } == Επεξήγηση του παραπάνω κώδικα == | ''names = new String[3][];'' | Αρχικά δεσμεύουμε ένα μονοδιάστατο πίνακα που τα στοιχεία του είναι μονοδιάστατοι πίνακες από [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]]. | | ''names[0] = new String[3]; names[1] = new String[5]; names[2] = new String[4];'' |Για κάθε θέση του παραπάνω πίνακα δεσμεύουμε ένα νέο μονοδιάστατο πίνακα από [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]]. Οι νέοι πίνακες δεν έχουν απαραίτητα το ίδιο μέγεθος. | | Προηγούμενο: [[java:objects| Δημιουργία Αντικειμένων]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:public_private_access_modifiers | Περιορισμός της πρόσβασης με τους προσδιοριστές private και public]] |