| Both sides previous revision
Previous revision
Next revision
|
Previous revision
Next revision
Both sides next revision
|
java:arrays [2016/02/22 11:21] gthanos |
java:arrays [2020/02/21 11:58] gthanos [Πίνακες δύο διαστάσεων] |
| Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά. | Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά. |
| </WRAP> | </WRAP> |
| | |
| | Εναλλακτικά, μπορείτε να ορίσετε το μέγεθος του πίνακα ορίζοντας και τα περιεχόμενα του στην δήλωση ορισμού του, όπως στο παρακάτω παράδειγμα: |
| | <code java> |
| | int[] numbers = {1,2,3,4,5,6,7,8,9,10}; |
| | </code> |
| | |
| Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων, η αρίθμηση των στοιχείων του είναι **0-9**, όπως φαίνεται στο παρακάτω σχήμα. | Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων, η αρίθμηση των στοιχείων του είναι **0-9**, όπως φαίνεται στο παρακάτω σχήμα. |
| |
| class ArrayDemo { | class ArrayDemo { |
| public static void main(String[] args) { | public static void main(String[] args) { |
| // declares an array of integers | |
| int[] anArray; | int[] anArray; |
| |
| // allocates memory for 10 integers | |
| anArray = new int[3]; | anArray = new int[3]; |
| | |
| System.out.println("Element at index " + i + "/" + anArray.length+": " + anArray[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); |
| | } |
| } | } |
| } | } |
| |
| <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) { |
| | 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]; |
| | } |
| | |
| | } |
| | </code> |
| | |
| | Στον παραπάνω κώδικα στην γραμμή ''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? |}} | |
| | |
| ===== Πίνακες δύο διαστάσεων ===== | ===== Πίνακες δύο διαστάσεων ===== |
| |
| </code> | </code> |
| |
| Το παραπάνω παράδειγμα ορίζει ένα πίνακα διαστάσεων **3x5**. __Η ιδιαιτερότητα της Java σε σχέση με την C είναι ότι μπορούμε να έχουμε διαφορετικό αριθμό στηλών σε κάθε γραμμή του πίνακα__. Δείτε το παρακάτω πρόγραμμα που περιέχει ένα πίνακα δύο διαστάσεων. Στην πρώτη γραμμή του πίνακα έχουμε 3 στοιχεία, ενώ στην 2η δύο στοιχεία. | Το παραπάνω παράδειγμα ορίζει ένα πίνακα διαστάσεων **3x5**. Επιπλέον, μπορούμε να έχουμε διαφορετικό αριθμό στηλών σε κάθε γραμμή του πίνακα. Δείτε το παρακάτω πρόγραμμα που περιέχει ένα πίνακα δύο διαστάσεων. Στην πρώτη γραμμή του πίνακα έχουμε 3 στοιχεία, ενώ στην 2η δύο στοιχεία. |
| <code java MultiDimArrayDemo.java> | <code java MultiDimArrayDemo.java> |
| class MultiDimArrayDemo { | class MultiDimArrayDemo { |
| public static void main(String[] args) { | public static void main(String[] args) { |
| String[][] names = { | String [][] names; |
| {"Mr. ", "Mrs. ", "Ms. "}, | names = new String[3][]; |
| {"Smith", "Jones"} | names[0] = new String[3]; |
| }; | names[1] = new String[5]; |
| // Mr. Smith | names[2] = new String[4]; |
| System.out.println(names[0][0] + names[1][0]); | |
| // Ms. Jones | names[0][0]="Mr. "; names[0][1]="Mrs. "; names[0][2]="Ms. "; |
| System.out.println(names[0][2] + names[1][1]); | 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."); |
| } | } |
| } | } |
| </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:variables | Μεταβλητές]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:operators | Τελεστές ]] | | | Προηγούμενο: [[java:objects| Δημιουργία Αντικειμένων]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:this_operator | Ο τελεστής this]] | |