Both sides previous revisionPrevious revisionNext revision | Previous revision |
java:arrays [2018/02/12 14:32] – [Πίνακες δύο διαστάσεων] gthanos | java:arrays [2022/02/23 15:35] (current) – external edit 127.0.0.1 |
---|
====== Πίνακες ====== | ====== Πίνακες ====== |
| |
Οι πίνακες στην γλώσσα προγραμματισμού **Java** ορίζονται σε αναλογία με την **C** ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται με χρήση του τελεστή **new**, σε μία δήλωση της μορφής | Οι πίνακες στην γλώσσα προγραμματισμού **Java** ορίζονται ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται μέσω του τελεστή **new**, με μία δήλωση της μορφής |
| |
<code java> | <code java> |
| |
<WRAP tip 80% round center> | <WRAP tip 80% round center> |
Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά. | Προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά. |
</WRAP> | </WRAP> |
| |
| |
<WRAP important 80% round center> | <WRAP important 80% round center> |
Οι πίνακες στη Java υλοποιούνται ως αντικείμενα (//θα τα δούμε αναλυτικά παρακάτω//). __Εφόσον αρχικοποιηθεί ένας πίνακας το μέγεθος του είναι σταθερό και δεν αλλάζει__. | Οι πίνακες στη Java υλοποιούνται ως αντικείμενα. __Εφόσον αρχικοποιηθεί ένας πίνακας το μέγεθος του είναι αμετάβλητο__. |
| |
Κάθε αντικείμενο πίνακα έχει ένα πεδίο **length** που αποθηκεύει το μέγεθος του πίνακα (π.χ. δείτε στο πρόγραμμα ''anArray.length'') και για το οποίο δεν μπορούμε να μεταβάλλουμε την τιμή του (δηλαδή είναι final field). Μέσω του πεδίου //length// μπορείτε να έχετε πρόσβαση στο μέγεθος του κάθε πίνακα. | Κάθε αντικείμενο πίνακα έχει ένα //read-only// πεδίο **length** που αποθηκεύει το μέγεθος του πίνακα. Μέσω του πεδίου //length// μπορείτε να έχετε πρόσβαση στο μέγεθος του εκάστοτε πίνακα. |
</WRAP> | </WRAP> |
| |
<WRAP tip 80% round center> | ===== Πίνακες αναφορικού τύπου ===== |
Κατεβάστε και εκτελέστε το παραπάνω πρόγραμμα. Παρατηρήστε ότι η κλήση της μεθόδου **System.out.println** εκτυπώνει στην κονσόλα σας ένα αλφαριθμητικό κατά την εκτέλεση του προγράμματος ακολουθούμενο από χαρακτήρα αλλαγής γραμμής. Εναλλακτικά της **System.out.println** μπορείτε να χρησιμοποιείτε και την μέθοδο **System.out.print**, όπου ο χαρακτήρας αλλαγής γραμμής παραλείπεται. | |
</WRAP> | Ας θεωρήσουμε το παρακάτω παράδειγμα κώδικα με βάση την κλάση **Rectangle** [[java:objects|της προηγούμενης ενότητας]]. |
| |
| <code java CreateRectanglesArray.java> |
| 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) { |
| System.out.println("rectangles["+(i++)+"]: "); |
| System.out.println("("+rectangle.getOrigin().getX()+","+rectangle.getOrigin().getY()+")\t"); |
| System.out.println("width: "+rectangle.getWidth()+", height: "+rectangle.getHeight()); |
| } |
| |
| rectangles[2] = rectangles[3]; |
| } |
| |
| } |
| </code> |
| |
| Στον παραπάνω κώδικα στην γραμμή ''Rectangle [] rectangles = new Rectangle[4];'' δημιουργούμε ένα πίνακα από δείκτες σε αντικείμενα τύπου **Rectangle**. Αρχικά ο πίνακας έχει σε όλες τις θέσεις του την τιμή **null**. Στις επόμενες γραμμές αναθέτουμε αντικείμενα σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο ίδιο αντικείμενο στο οποίο δείχνει και η μεταβλητή **rectOne**. |
| |
| Εάν επιχειρήσουμε να σχεδιάσουμε το παραπάνω διάγραμμα αυτό θα δείχνει ως εξής: |
| |
| | Αρχικά δημιουργείται ένας πίνακας που όλα τα στοιχεία του είναι **null**. | Στη συνέχεια δημιουργούμε αντικείμενα και τα αναθέτουμε σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο αντικείμενο που δείχνει και η μεταβλητή **rectOne**. | Η ανάθεση του αντικειμένου της θέσης 3 στην θέση 2 αφαιρεί την αναφορά από το αντικείμενο με πλάτος 50 και ύψος 100. Εφόσον δεν υπάρχουν αναφορές προς αυτό, το αντικείμενο αυτό καταστρέφεται από τον [[java:objects#garbage_collection|Garbage Collector]]. Μαζί καταστρέφεται και το αντικείμενο τύπου Point στο οποίο δείχνει το πεδίο origin του αντικειμένου προς διαγραφή. | |
| | {{ :java:createrectangletable1.png?150 |}} | {{ :java:createrectangletable2.png? |}}| {{:java:createrectangletable3.png? |}} | |
| |
===== Πίνακες δύο διαστάσεων ===== | ===== Πίνακες δύο διαστάσεων ===== |
| |
} | } |
</code> | </code> |
| |
| == Επεξήγηση του παραπάνω κώδικα == |
| | ''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]] | | | Προηγούμενο: [[java:objects| Δημιουργία Αντικειμένων]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:this_operator | Ο τελεστής this]] | |