Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών Πίνακες στη Java Βελώνης Γεώργιος – Καθηγητής Πληροφορικής ΠΕ20 Σχολ. Έτος 2015-16
Περιεχόμενα Εισαγωγή Δημιουργία Πινάκων Παραδείγματα
Εισαγωγή Οι πίνακες (arrays) είναι από τις πιο συχνά χρησιμοποιούμενες δομές δεδομένων, λόγω της ευκολίας που προσφέρουν στην διαχείριση μεγάλου πλήθους δεδομένων. Ένας πίνακας αποτελείται από στοιχεία, τα οποία τοποθετούνται σε συνεχόμενες θέσεις μνήμης. Τα στοιχεία αυτά έχουν όλα τον ίδιο τύπο (int, float, κ.λπ.), που ονομάζεται βασικός τύπος του πίνακα. Το πλήθος των στοιχείων καθορίζει το μέγεθος του πίνακα, το οποίο παραμένει σταθερό (στατική δομή δεδομένων) σε όλη την διάρκεια εκτέλεσης του προγράμματος. Σχηματικά ένας πίνακας με δέκα στοιχεία μπορεί να παρασταθεί ως εξής:
Εισαγωγή Κάθε πίνακας έχει ένα όνομα. Η αναφορά στα στοιχεία ενός πίνακα γίνεται μέσων του ονόματός του και ενός δείκτη που καθορίζει την θέση του στοιχείου μέσα στον πίνακα. Μπορείτε να αναφερθείτε σε οποιοδήποτε στοιχείο του πίνακα και με οποιαδήποτε σειρά, κάτι που χαρακτηρίζει τον πίνακα σαν δομή άμεσης προσπέλασης. Τα στοιχεία ενός πίνακα μπορούν να τα χρησιμοποιηθούν στο πρόγραμμα, όπως και οποιαδήποτε μεταβλητή του βασικού τύπου. Οι πίνακες είναι δομές δεδομένων που συναντώνται σχεδόν σε όλες τις γλώσσες προγραμματισμού με μόνη διαφορά ότι στη Java οι πίνακες είναι αντικείμενα. Υπάρχουν οι μονοδιάστατοι και οι πολυδιάστατοι πίνακες. Στην ενότητα αυτή θα ασχοληθούμε μόνο με τους μονοδιάστατους πίνακες της Java.
Δημιουργία Πινάκων Υπάρχουν τρία στάδια για τη δημιουργία πινάκων: Η δήλωση του πίνακα Ο ορισμός του πίνακα Η αρχικοποίηση του πίνακα
Δημιουργία Πινάκων Η δήλωση του πίνακα (μονοδιάστατου) Όπως όλες οι μεταβλητές στη Java, έτσι και οι πίνακες πρέπει να δηλώνονται. Όταν δηλώνουμε έναν πίνακα βάζουμε στον τύπο και το [ ] που δείχνει ότι η μεταβλητή είναι ένας πίνακας. Σύνταξη: τύπος όνομα_μεταβλητής[ ] ή τύπος [ ] όνομα_μεταβλητής Παραδείγματα: float a[ ]; int [ ]x; String names[ ]; Με άλλα λόγια δηλώνουμε έναν πίνακα όπως δηλώνουμε οποιαδήποτε άλλη μεταβλητή μόνο που βάζουμε και αγκύλες στο τέλος ή την αρχή του τύπου της μεταβλητής.
Δημιουργία Πινάκων Ο ορισμός του πίνακα (μονοδιάστατου) Για να δημιουργήσουμε έναν πίνακα χρησιμοποιούμε τον τελεστή new. Πρέπει να πούμε στον compiler πόσα στοιχεία θα αποθηκευτούν στον πίνακα. Σύνταξη: όνομα_μεταβλητής = new τύπος[πλήθος_στοιχείων] Παραδείγματα: a = new float[10]; x = new int[5]; names = new String[10]; Βέβαια, μπορούμε να κάνουμε δήλωση και καταχώρηση σε μια πρόταση, όπως: int x[ ] = new int[5]; ή int [ ]x = new int[5];
Δημιουργία Πινάκων Η αρχικοποίηση του πίνακα (μονοδιάστατου) Κάθε στοιχείο του πίνακα προσδιορίζεται από το όνομα του πίνακα και από έναν ακέραιο που φανερώνει τη θέση του στον πίνακα. Οι αριθμοί που χρησιμοποιούνται ονομάζονται δείκτες του πίνακα. Οι δείκτες είναι συνεχόμενοι αριθμοί που ξεκινούν από το 0. Γι’ αυτό και ο πίνακας x (5 στοιχείων) έχει τα στοιχεία x[0], x[1], x[2], x[3] και x[4]. Εφόσον ξεκινάμε από το 0 δεν υπάρχει x[5] και αν προσπαθήσουμε να έχουμε πρόσβαση σ’ αυτό θα δημιουργήσουμε ένα ArrayIndexOutOfBoundsException. Παραδείγματα: a[0] = 4.5f; x[0] = 10; names[0] = "George";
Δημιουργία Πινάκων Η αρχικοποίηση του πίνακα (μονοδιάστατου) Ακόμα και για τους πίνακες μεσαίου μεγέθους είναι σπάνιο να αρχικοποιούμε κάθε στοιχείο ξεχωριστά. Συχνά είναι πιο εύκολο να χρησιμοποιούμε τον βρόγχο for: int[ ] x = new int[5]; for (int i=0; i < 5; i++) { x[i] = 0; } Ένας άλλος τρόπος απόδοσης αρχικών τιμών σε πίνακα, είναι να τις τοποθετήσουμε μέσα σε άγκιστρα: int x[ ] = {0,0,0,0,0};
Δημιουργία Πινάκων Η αρχικοποίηση του πίνακα (μονοδιάστατου) Μπορούμε επίσης να αποδώσουμε αρχικές τιμές σε έναν πίνακα με τη βοήθεια ενός άλλου πίνακα: int y[ ] = x; Αποδίδουμε αρχικές τιμές στα στοιχεία του πίνακα y με βάση τα στοιχεία του x. Με αυτόν τον τρόπο δημιουργούμε δύο μεταβλητές με δείκτη (πίνακες), οι οποίες δείχνουν τα ίδια στοιχεία της μνήμης. Για να αναφερθούμε στο πλήθος των στοιχείων ενός πίνακα χρησιμοποιούμε το όνομα του πίνακα, μια τελεία και τη λέξη length. Το x.length αποδίδει το μήκος του πίνακα x. Παράδειγμα: for (int i=0; i < x.length; i++){ x[i] = 0; }
Παραδείγματα Παράδειγμα 1α public class example1a{ public static void main(String[ ] args) { char[ ] letters= new char[4]; letters[0] = 'A'; letters[1] = 'n'; letters[2] = 'n'; letters[3] = 'a'; for (int i=0;i<=3;i++) { System.out.print(letters[i]); }
Παραδείγματα Παράδειγμα 1β public class example1b{ public static void main(String[ ] args) { char letters[ ] ={'A','n','n','a'}; for (int i=0;i<=3;i++) { System.out.print(letters[i]); }
Παραδείγματα Παράδειγμα 2 import java.util.*; public class exmple2{ public static void main(String args[]){ int i; int[ ] x= new int[5]; Scanner read = new Scanner(System.in); for (i=0;i<x.length;i++) { System.out.format("Enter %2d element: ",i+1); x[i]=read.nextInt(); } System.out.println(2*x[i]);
Παραδείγματα Παράδειγμα 3 import java.util.*; public class exmple3{ public static void main(String args[]){ int i,sum=0; int[ ] x= new int[5]; Scanner read = new Scanner(System.in); for (i=0;i<x.length;i++) { System.out.format("Enter %2d element: ",i+1); x[i]=read.nextInt(); } sum+=x[i]; System.out.println("sum : "+ sum);
Παραδείγματα Παράδειγμα 4 Σειριακή αναζήτηση (Sequential Search): import java.util.*; public class exmple4{ public static void main(String args[]){ int numbers[ ] ={2,3,6,4,9,7,10,5}; Scanner read = new Scanner(System.in); System.out.print("Enter the integer to be searched: "); int x=read.nextInt(); boolean flag=false; int i=0,position=0;
Παραδείγματα while(flag==false && i<numbers.length) { Παράδειγμα 4 Σειριακή αναζήτηση (Sequential Search) συνέχεια: while(flag==false && i<numbers.length) { if (numbers[i]==x){ flag=true; position=i; } else i+=1; if (flag==true) System.out.println("The integer found at position "+(position+1)); System.out.println("Search unsuccessful");
Παραδείγματα public class example5{ Παράδειγμα 5 Αναζήτηση μεγίστου στοιχείου πίνακα: public class example5{ public static void main(String args[]){ int numbers[ ] ={2,3,6,4,9,7,10,5}; int max,i; max=numbers[0]; for(i=1;i<numbers.length;i++) if(numbers[i]>max) max=numbers[i]; System.out.println("Max: "+max); }
Παραδείγματα Παράδειγμα 6 Ταξινόμηση με επιλογή (Selection Sort): public class example6{ public static void main(String args[]){ int numbers[ ] ={2,3,6,4,9,7,10,5}; int i,j,minIndex,temp; for (i = 0; i < numbers.length - 1; i++) { minIndex = i; for (j = i + 1; j < numbers.length; j++) if (numbers[j] < numbers[minIndex]) minIndex = j; if (minIndex != i) { temp = numbers[i]; numbers[i] = numbers[minIndex]; numbers[minIndex] = temp; }
Παραδείγματα Παράδειγμα 6 Ταξινόμηση με επιλογή (Selection Sort) συνέχεια: for(i=0;i<numbers.length;i++) System.out.print(numbers[i]+" "); }
Πηγές http://www.it.uom.gr/project/java/tutorial.htm#arrays Εισαγωγή στην Java 2 – Γεώργιος Λιακέας Algorithms and Data Structures (http://www.algolist.net)