java:arrays

Πίνακες

Οι πίνακες στην γλώσσα προγραμματισμού Java ορίζονται σε αναλογία με την C ως ένα σύνολο τιμών του ιδίου τύπου δεδομένων του οποίου ο αριθμός των μελών ορίζεται κατά την αρχικοποίηση του πίνακα. Η αρχικοποίηση ενός πίνακα γίνεται με χρήση του τελεστή new, σε μία δήλωση της μορφής

int [] anArray; 
anArray = new int[5];
int anotherArray[]; 
anotherArray = new int[10];
     ή
int [] anArray = new int[5];
int anotherArray[] = new int[10];

Ο παραπάνω κώδικας ορίζει δύο πίνακες τύπου int μεγέθους 5 και 10 αντίστοιχα. Παρατηρήστε ότι κατά τον ορισμό του πίνακα ο τελεστής [] μπορεί να τοποθετηθεί πριν ή μετά το όνομα της μεταβλητής.

Σημειώστε ότι κατά σύμβαση προτιμάται η τοποθέτηση του τελεστή [] πριν το όνομα της μεταβλητής, και όχι μετά.

Εναλλακτικά, μπορείτε να ορίσετε το μέγεθος του πίνακα ορίζοντας και τα περιεχόμενα του στην δήλωση ορισμού του, όπως στο παρακάτω παράδειγμα:

int[] numbers = {1,2,3,4,5,6,7,8,9,10};

Η αρίθμηση των στοιχείων του πίνακα ξεκινάει από τον δείκτη 0 και αυξάνει. Για παράδειγμα για ένα πίνακα 10 θέσεων, η αρίθμηση των στοιχείων του είναι 0-9, όπως φαίνεται στο παρακάτω σχήμα.

Μπορείτε να δείτε ενδεικτικά το παρακάτω πρόγραμμα, όπου ορίζεται ένας πίνακας ακεραίων μεγέθους 3, ο πίνακας γεμίζει με τιμές και στη συνέχεια εκτυπώνονται τα περιεχόμενα του.

ArrayDemo.java
class ArrayDemo {
  public static void main(String[] args) {
    int[] anArray;
 
    anArray = new int[3];
 
    anArray[0] = 100;
    anArray[1] = 200;
    anArray[2] = 300;
 
    for(int i=0; i < anArray.length; 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);
    } 
  }
}

Οι πίνακες στη Java υλοποιούνται ως αντικείμενα. Εφόσον αρχικοποιηθεί ένας πίνακας το μέγεθος του είναι αμετάβλητο.

Κάθε αντικείμενο πίνακα έχει ένα read-only πεδίο length που αποθηκεύει το μέγεθος του πίνακα. Μέσω του πεδίου length μπορείτε να έχετε πρόσβαση στο μέγεθος του εκάστοτε πίνακα.

Πίνακες αναφορικού τύπου

Ας θεωρήσουμε το παρακάτω παράδειγμα κώδικα με βάση την κλάση Rectangle της προηγούμενης ενότητας.

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];
  }
 
}

Στον παραπάνω κώδικα στην γραμμή Rectangle [] rectangles = new Rectangle[4]; δημιουργούμε ένα πίνακα από δείκτες σε αντικείμενα τύπου Rectangle. Αρχικά ο πίνακας έχει σε όλες τις θέσεις του την τιμή null. Στις επόμενες γραμμές αναθέτουμε αντικείμενα σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο ίδιο αντικείμενο στο οποίο δείχνει και η μεταβλητή rectOne.

Εάν επιχειρήσουμε να σχεδιάσουμε το παραπάνω διάγραμμα αυτό θα δείχνει ως εξής:

Αρχικά δημιουργείται ένας πίνακας που όλα τα στοιχεία του είναι null. Στη συνέχεια δημιουργούμε αντικείμενα και τα αναθέτουμε σε κάθε θέση του πίνακα. Οι θέσεις 0 και 1 του πίνακα δείχνουν στο αντικείμενο που δείχνει και η μεταβλητή rectOne. Η ανάθεση του αντικειμένου της θέσης 3 στην θέση 2 δημιουργεί ένα αντικείμενο για το οποίο δεν υπάρχει αναφορά. Το αντικείμενο αυτό καταστρέφεται από τον Garbage Collector.

Πίνακες δύο διαστάσεων

Οι πίνακες δύο διαστάσεων ορίζονται σε αναλογία με τους πίνακες μίας διάστασης ως εξής:

int [][] anArray;
anArray = new int[3][5];
      ή
int [][] anArray = new int[3][5];

Το παραπάνω παράδειγμα ορίζει ένα πίνακα διαστάσεων 3×5. Επιπλέον, μπορούμε να έχουμε διαφορετικό αριθμό στηλών σε κάθε γραμμή του πίνακα. Δείτε το παρακάτω πρόγραμμα που περιέχει ένα πίνακα δύο διαστάσεων. Στην πρώτη γραμμή του πίνακα έχουμε 3 στοιχεία, ενώ στην 2η δύο στοιχεία.

MultiDimArrayDemo.java
class MultiDimArrayDemo {
  public static void main(String[] args) {
    String [][] names;
    names = new String[3][];
    names[0] = new String[3];
    names[1] = new String[5];
    names[2] = new String[4];
 
    names[0][0]="Mr. "; names[0][1]="Mrs. "; names[0][2]="Ms. ";
    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.");
  }
}
Επεξήγηση του παραπάνω κώδικα
names = new String[3][]; Αρχικά δεσμεύουμε ένα μονοδιάστατο πίνακα που τα στοιχεία του είναι μονοδιάστατοι πίνακες από java.lang.String.
names[0] = new String[3]; names[1] = new String[5]; names[2] = new String[4]; Για κάθε θέση του παραπάνω πίνακα δεσμεύουμε ένα νέο μονοδιάστατο πίνακα από java.lang.String. Οι νέοι πίνακες δεν έχουν απαραίτητα το ίδιο μέγεθος.
java/arrays.txt · Last modified: 2018/02/16 17:25 by gthanos