This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
java:arrays [2015/09/18 10:25] 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]] | |