java:array_list

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Η κλάση ArrayList ====== Μέχρι τώρα είδαμε την χρήση πινάκων ως έναν τρόπο αποθήκευσης πολλαπλών αντικειμένων του ιδίου τύπου. Είδαμε επίσης ότι οι πίνακες δεν έχουν την δυνατότητα να μεταβάλλουν το μέγεθος τους μετά την δημιουργία τους. Αυτό πρακτικά σημαίνει ότι οι προγραμματιστές καλούνται να γνωρίζουν εκ των προτέρων το μέγεθος του πίνακα, πράγμα που δεν είναι πάντα δυνατό να συμβαίνει. Εκτός από την χρήση των συμβατικών πινάκων η Java μας δίνει την δυνατότητα να χρησιμοποιήσουμε δομές δεδομένων οι οποίες έχουν την δυνατότητα να αυξομειώνουν το μέγεθος ανάλογα με τις αποθηκευτικές ανάγκες που προκύπτουν. Μία από τις κλάσεις αυτές είναι η κλάση [[http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html|java.util.ArrayList]] την οποία θα δούμε στη συνέχεια. Φανταστείτε ένα αντικείμενο της κλάσης //ArrayList// ως ένα πίνακα που έχει την δυνατότητα να αυξομειώνει το μέγεθος του δυναμικά κατά την διάρκεια της εκτέλεσης του προγράμματος. Στη συνέχεια θα δούμε τις βασικές μεθόδους χρήσης της κλάσης //ArrayList//. **Κατασκευαστές** * ''public ArrayList()'' : Αρχικοποίηση της δομής δεδομένων. * ''public ArrayList(int initialCapacity)'' : Αρχικοποίηση της δομής δεδομένων ορίζοντας ένα αρχικό μέγεθος για τα δεδομένα που θα αποθηκευτούν. <WRAP tip 80% center round> Ο κατασκευαστής της κλάσης ArrayList καλείται με μία επιπλέον παράμετρο που είναι ο τύπος των δεδομένων που θα αποθηκευτούν σε αυτή. Για παράδειγμα, εάν θέλετε να αποθηκεύσετε δεδομένα τύπου String θα γράψετε. <code java> ArrayList<String> = new ArrayList<String>(); </code> ενώ αν θέλετε να αποθηκεύσετε δεδομένα τύπου //TelephoneNumber// θα γράψετε <code java> ArrayList<TelephoneNumber> = new ArrayList<TelephoneNumber>(); </code> </WRAP> **Μέθοδοι** * ''public boolean add(E e)'' : Προσθέτει ένα αντικείμενο της στο τέλος της δομής. * ''public void add(int index, E element)'' : Προσθέτει ένα αντικείμενο στη θέση index. Η μέθοδος είναι χρήσιμη εάν θέλετε να προσθέσετε στην αρχή. Σε αυτή την περίπτωση μπορείτε να θέσετε την τιμή index ίση με 0. * ''public void clear()'' : Διαγράφει όλα τα δεδομένα από την δομή. * ''public boolean contains(Object o)'' : Ελέγχει εάν η λίστα περιέχει το συγκεκριμένο στοιχείο. * ''public E get(int index)'' : Επιστυρέφει το στοιχείο της λίστας που βρίσκεται στην θέση index. Η αρίθμηση των στοιχείων της λίστας ξεκινάει από 0 έως size-1, όπου size ο αριθμός των αποθηκευμένων στοιχείων. * ''public int indexOf(Object o)'' : Επιστρέφει τη θέση του συγκεκριμένου στοιχείου στη λίστα. Εάν δεν υπάρχει το στοιχείο στη λίστα επιστρέφει -1. * ''public boolean isEmpty()'' : Επιστρέφει **true** εάν η λίστα είναι άδεια, διαφορετικά επιστρέφει **false**. * ''public Iterator<E> iterator()'' : Επιστρέφει ένα αντικείμενο τύπου [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|java.util.Iterator]] προκειμένου να μπορούμε να διατρέξουμε τη λίστα. * ''public E remove(int index)'' : Διαγράφει το αντικείμενο που είναι αποθηκευμένο στη λίστα στη θέση index. * ''public boolean remove(Object o)'' : Διαγράφει το αντικείμενο από την λίστα, εφόσον αυτό υπάρχει και επιστρέφει **true**. Εάν δεν υπάρχει επιστρέφει **false**. * ''public int size()'' : Επιστρέφει τον αριθμό των αποθηκευμένων στοιχείων στη δομή. * ''public E set(int index, E element)'' : Θέτει την τιμή του στοιχείου στη θέση index ίση με element. Η κλάση [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|java.util.Iterator]] μας δίνει την δυνατότητα να διατρέξουμε την δομή και να διαγράψουμε δεδομένα από αυτή μέσα από τις παρακάτω μεθόδους. Όταν δημιουργηθεί ένα αντικείμενο τύπου //Iterator// αυτό δείχνει στην αρχή της δομής δηλαδή στη θέση 0 (index = 0). * ''boolean hasNext()'' : Επιστρέφει true εάν υπάρχει τουλάχιστον ένα επιπλέον αντικείμενο αποθηκευμένο στη δομή σε σχέση με την τρέχουσα θέση του //Iterator//. * ''E next()'' : Επιστρέφει το νέο αντικείμενο εφόσον υπάρχει. * ''void remove()'' : Διαγράφει το αντικείμενο που βρίσκεται στη τρέχουσα θέση του //Iterator// από την δομή. **ΠΡΟΣΟΧΗ**: Ο μόνος ασφαλής τρόπος αφαίρεσης στοιχείου από ArrayList κατά τη διάρκεια διάτρεξης του ΑrrayList είναι με χρήση //Iterator//. ===== Παράδειγμα 1 ===== Με βάση τα παραπάνω παραθέτουμε ένα πρόγραμμα το οποίο δημιουργεί μία σειρά από 20 τυχαίους αριθμούς και τους αποθηκεύει σε ένα [[http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html|ArrayList]]. Το πρόγραμμα παραθέτει τρεις (3) διαφορετικές μεθόδους για την διάτρεξη της λίστας //α)// με χρήση κλασσικού //for// //β)// με χρήση //[[java:loop_statements#for_statement|enhanced for]]// και //γ)// με χρήση //iterator//. Το πρόγραμμα κάνει τα εξής: - εκτυπώνει τη λίστα με χρήση της πρώτης μεθόδου διάτρεξης. - ταξινομεί τη λίστα με χρήση της στατικής μεθόδου [[http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-|Collections.sort]]. - εκτυπώνει τη λίστα με χρήση της δεύτερης μεθόδου διάτρεξης. - αφαιρεί τους περιττούς αριθμούς με χρήση της μεθόδου //removeOddNumbers//. - εκτυπώνει τη λίστα με χρήση της τρίτης μεθόδου διάτρεξης. <code java ArrayListManipulation.java> import java.util.ArrayList; import java.util.List; import java.util.Iterator; import java.util.Collections; import java.util.Random; import java.util.Date; public class ArrayListManipulation { public static void main(String []args) { Random rand = new Random(new Date().getTime()); ArrayList list = new ArrayList(); for(int i=0; i<20; i++) { list.add(rand.nextInt(100)); } System.out.println(listToString(list)); Collections.sort(list); System.out.println(listToString2(list)); removeOddNumbers(list); System.out.println(listToString3(list)); } public static String listToString(ArrayList list) { String str = ""; for(int i=0; i<list.size(); i++) str += list.get(i) + " "; return str; } public static String listToString2(ArrayList list) { String str = ""; for(Object e : list) str += e + " "; return str; } public static String listToString3(ArrayList list) { String str = ""; Iterator it = list.iterator(); while(it.hasNext()) str += it.next()+" "; return str; } public static void removeOddNumbers(ArrayList list) { Iterator it = list.iterator(); while(it.hasNext()) { int num = (Integer)it.next(); if(num % 2 != 0) it.remove(); } } } </code> ===== Παράδειγμα 2 ===== Στο επόμενο παράδειγμα θα προσπαθήσουμε να εντοπίσουμε τα αρχεία με κατάληξη **.mp3** που βρίσκονται μέσα σε ένα κατάλογο του filesystem μας και στη συνέχεια θα επιχειρήσουμε να τα αναπαράγουμε με την σειρά παίζοντας 10 sec από το κάθε αρχείο. Το παρακάτω πρόγραμμα δουλεύει μόνο για την έκδοση 8 της Java. <code java Mp3Player.java> import javafx.scene.media.*; import javafx.embed.swing.*; import java.net.*; import java.io.*; import java.util.*; class Mp3Player { public static void main(String []args) throws Exception { final JFXPanel fxPanel = new JFXPanel(); ArrayList<File> listFiles = listMp3( args[0] ); Iterator<File> itF = listFiles.iterator(); ArrayList<MediaPlayer> mpl = new ArrayList<>(); while( itF.hasNext() ) { File f = itF.next(); mpl.add ( createMediaPlayer(f.toString()) ); } while( mpl.size() > 0 ) { MediaPlayer player = mpl.remove(0); player.play(); Thread.sleep(10000); player.stop(); } } static ArrayList<File> listMp3(String directory ) { File dir = new File(directory); ArrayList<File> files = new ArrayList<File>(Arrays.asList(dir.listFiles())); Iterator<File> it = files.iterator(); while( it.hasNext()) { File f = it.next(); if( !f.getName().substring(f.getName().length()-4).equals(".mp3") ) { System.out.println("-"+f.getName()); it.remove(); } else { System.out.println("+"+f.getName()); } } return files; } static MediaPlayer createMediaPlayer(String filename) { try { Media media = new Media( (new File(filename)).toURI().toURL().toString() ); MediaPlayer mediaPlayer = new MediaPlayer(media); return mediaPlayer; } catch (Exception ex) { ex.printStackTrace(); } return null; } } </code> Αρχικά δημιουργούμε ένα ArrayList με τα αρχεία που έχουν κατάληξη **.mp3** μέσω της μεθόδου <code java> static ArrayList<File> listMp3(String directory ); </code> Στη συνέχεια από το ArrayList που κατασκευάσαμε, δημιουργούμε για κάθε αρχείο mp3, ένα αντικείμενο τύπου MediaPlayer που θα αναπαράγει το τραγούδι μέσω της μεθόδου <code java> static MediaPlayer createMediaPlayer(String filename); </code> Όλα τα αντικείμενα του τύπου MediaPlayer που δημιουργήσαμε τα τοποθετούμε μέσα στο ArrayList //mpl//. <code java> ArrayList<MediaPlayer> mpl = new ArrayList<>(); </code> Στη συνέχεια αναπαράγουμε τα αρχεία ένα-ένα αφαιρώντας τα αντικείμενα του τύπου MediaPlayer από την λίστα. <code java> while( mpl.size() > 0 ) { MediaPlayer player = mpl.remove(0); player.play(); Thread.sleep(10000); player.stop(); } </code> |Προηγούμενο: [[ :java:packages:using | Χρήση κλάσεων από άλλες κλάσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:inheritance | Κληρονομικότητα ]] |

java/array_list.1490992378.txt.gz · Last modified: 2017/03/31 20:32 by gthanos