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/01/15 05:29]
gthanos [Πίνακες]
java:arrays [2018/02/16 17:25] (current)
gthanos
Line 4: Line 4:
  
 <code java> <code java>
-int [] anArray; anArray = new int[5]; +int [] anArray; ​ 
-int anotherArray[];​ anotherArray[] = new int[10];+anArray = new int[5]; 
 +int anotherArray[]; ​ 
 +anotherArray = new int[10];
      ή      ή
 int [] anArray = new int[5]; int [] anArray = new int[5];
Line 11: 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 21: 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 υλοποιούνται ως αντικείμενα ​(//θα τα δούμε αναλυτικά παρακάτω//). Κάθε αντικείμενο έχει ένα πεδίο **length** που αποθηκεύει το μέγεθος του πίνακα ​(π.χ. ''​anArray.length''​) και το οποίο δεν μεταβάλει την τιμή του (δηλαδή είναι final field). Μέσω του πεδίου //length// μπορείτε να έχετε πρόσβαση στο μέγεθος του κάθε πίνακα.+Οι πίνακες στη Java υλοποιούνται ως αντικείμενα. __Εφόσον αρχικοποιηθεί ένας πίνακας το μέγεθος του είναι αμετάβλητο__ 
 + 
 +Κάθε αντικείμενο ​πίνακα ​έχει ένα ​//​read-only// ​πεδίο **length** που αποθηκεύει το μέγεθος του πίνακα. Μέσω του πεδίου //length// μπορείτε να έχετε πρόσβαση στο μέγεθος του ​εκάστοτε πίνακα.
 </​WRAP>​ </​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 54: 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.1452835783.txt.gz · Last modified: 2016/02/26 11:15 (external edit)