User Tools

Site Tools


java:arrays

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:arrays [2017/02/14 08:02]
gthanos
java:arrays [2022/02/23 15:35]
gthanos [Πίνακες αναφορικού τύπου]
Line 1: Line 1:
 ====== Πίνακες ====== ====== Πίνακες ======
  
-Οι πίνακες στην γλώσσα προγραμματισμού **Java** ορίζονται σε αναλογία με την **C** ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται με χρήση του τελεστή **new**, σε μία δήλωση της μορφής+Οι πίνακες στην γλώσσα προγραμματισμού **Java** ορίζονται ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται μέσω του τελεστή **new**, με μία δήλωση της μορφής
  
 <code java> <code java>
Line 16: Line 16:
  
 <WRAP tip 80% round center> <WRAP tip 80% round center>
-Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά.+Προτιμάται η τοποθέτηση του τελεστή **[]** πριν το όνομα της μεταβλητής, και όχι μετά.
 </WRAP> </WRAP>
  
Line 54: Line 54:
  
 <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?  |}}  | 
 + 
 ===== Πίνακες δύο διαστάσεων ===== ===== Πίνακες δύο διαστάσεων =====
  
Line 73: Line 107:
 </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]]  |
java/arrays.txt · Last modified: 2022/02/23 15:35 (external edit)