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 [2016/02/16 17:02]
doufexi
java:arrays [2018/02/16 17:25] (current)
gthanos
Line 7: Line 7:
 anArray = new int[5]; anArray = new int[5];
 int anotherArray[]; ​ int anotherArray[]; ​
-anotherArray[] = new int[10];+anotherArray = new int[10];
      ή      ή
 int [] anArray = new int[5]; int [] anArray = new int[5];
Line 13: Line 13:
 </​code>​ </​code>​
  
-Ο παραπάνω κώδικας ορίζει δύο πίνακες τύπου **int** μεγέθους **5** και **10** αντίστοιχα. Παρατηρήστε ότι κατά τον ορισμό του πίνακα ο τελεστής **[]** μπορεί να τοποθετηθεί πριν η μετά το όνομα της μεταβλητής.+Ο παραπάνω κώδικας ορίζει δύο πίνακες τύπου **int** μεγέθους **5** και **10** αντίστοιχα. Παρατηρήστε ότι κατά τον ορισμό του πίνακα ο τελεστής **[]** μπορεί να τοποθετηθεί πριν ​ή μετά το όνομα της μεταβλητής. 
 + 
 +<WRAP tip 80% round center>​ 
 +Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή **[]** πριν ​το όνομα της μεταβλητής, και όχι μετά. 
 +</​WRAP>​ 
 + 
 +Εναλλακτικά,​ μπορείτε να ορίσετε το μέγεθος του πίνακα ορίζοντας και τα περιεχόμενα του στην δήλωση ορισμού του, όπως στο παρακάτω παράδειγμα:​ 
 +<code java> 
 +int[] numbers = {1,​2,​3,​4,​5,​6,​7,​8,​9,​10};​ 
 +</​code>​
  
 Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων,​ η αρίθμηση των στοιχείων του είναι **0-9**, όπως φαίνεται στο παρακάτω σχήμα. Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων,​ η αρίθμηση των στοιχείων του είναι **0-9**, όπως φαίνεται στο παρακάτω σχήμα.
Line 23: Line 32:
 <code java ArrayDemo.java>​ <code java ArrayDemo.java>​
 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]; +       ​ 
-           ​ +    anArray[0] = 100; 
-        anArray[0] = 100; +    anArray[1] = 200; 
-        anArray[1] = 200; +    anArray[2] = 300; 
-        anArray[2] = 300; +     
-         +    for(int i=0; i < anArray.length;​ i++) { 
-        for(int i=0; i<​anArray.length;​ i++) { +      System.out.println("​Element at index " + i + "/"​ + anArray.length+":​ " + anArray[i]);
-          System.out.println("​Element at index "​+i+"/"​+anArray.length+":​ "+ anArray[0]); +
-        }+
     }     }
 +   
 +    int j=0;
 +    for(int element: anArray) {      ​
 +      System.out.println("​Element at index " + (j++) + "/"​ + anArray.length+":​ " + element);
 +    } 
 +  }
 } }
 </​code>​ </​code>​
  
 <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.prin**t, όπου ο χαρακτήρας αλλαγής γραμμής ​παραλείπεται. + 
-</​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 java> <code java>
Line 61: Line 108:
 </​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 ​Μεταβλητές]]   | [[java:operators ​Τελεστές ]]  |+Προηγούμενο: ​[[java:objectsΔημιουργία Αντικειμένων]] | [[:toc | Περιεχόμενα ​]]   ​| ​Επόμενο: ​[[java:public_private_access_modifiers ​Περιορισμός της πρόσβασης με τους προσδιοριστές ​private και public]]  |
java/arrays.1455642121.txt.gz · Last modified: 2016/02/26 11:15 (external edit)