java:array_list

Η κλάση ArrayList

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

Εκτός από την χρήση των συμβατικών πινάκων η Java μας δίνει την δυνατότητα να χρησιμοποιήσουμε δομές δεδομένων οι οποίες έχουν την δυνατότητα να αυξομειώνουν το μέγεθος ανάλογα με τις αποθηκευτικές ανάγκες που προκύπτουν. Μία από τις κλάσεις αυτές είναι η κλάση java.util.ArrayList την οποία θα δούμε στη συνέχεια.

Φανταστείτε ένα αντικείμενο της κλάσης ArrayList ως ένα πίνακα που έχει την δυνατότητα να αυξομειώνει το μέγεθος του δυναμικά κατά την διάρκεια της εκτέλεσης του προγράμματος. Στη συνέχεια θα δούμε τις βασικές μεθόδους χρήσης της κλάσης ArrayList.

Κατασκευαστές

  • public ArrayList() : Αρχικοποίηση της δομής δεδομένων.
  • public ArrayList(int initialCapacity) : Αρχικοποίηση της δομής δεδομένων ορίζοντας ένα αρχικό μέγεθος για τα δεδομένα που θα αποθηκευτούν.

Ο κατασκευαστής της κλάσης ArrayList καλείται με μία επιπλέον παράμετρο που είναι ο τύπος των δεδομένων που θα αποθηκευτούν σε αυτή. Για παράδειγμα, εάν θέλετε να αποθηκεύσετε δεδομένα τύπου String θα γράψετε.

ArrayList<String> = new ArrayList<String>();

ενώ αν θέλετε να αποθηκεύσετε δεδομένα τύπου TelephoneNumber θα γράψετε

ArrayList<TelephoneNumber> = new ArrayList<TelephoneNumber>();

Μέθοδοι

  • 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() : Επιστρέφει ένα αντικείμενο τύπου 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.

Η κλάση java.util.Iterator μας δίνει την δυνατότητα να διατρέξουμε την δομή και να διαγράψουμε δεδομένα από αυτή μέσα από τις παρακάτω μεθόδους. Όταν δημιουργηθεί ένα αντικείμενο τύπου Iterator αυτό δείχνει στην αρχή της δομής δηλαδή στη θέση 0 (index = 0).

  • boolean hasNext() : Επιστρέφει true εάν υπάρχει τουλάχιστον ένα επιπλέον αντικείμενο αποθηκευμένο στη δομή σε σχέση με την τρέχουσα θέση του Iterator.
  • E next() : Επιστρέφει το νέο αντικείμενο εφόσον υπάρχει.
  • void remove() : Διαγράφει το αντικείμενο που βρίσκεται στη τρέχουσα θέση του Iterator από την δομή. ΠΡΟΣΟΧΗ: Ο μόνος ασφαλής τρόπος αφαίρεσης στοιχείου από ArrayList κατά τη διάρκεια διάτρεξης του ΑrrayList είναι με χρήση Iterator.

Παράδειγμα 1

Με βάση τα παραπάνω παραθέτουμε ένα πρόγραμμα το οποίο διαβάζει από το πληκτρολόγιο μία σειρά από 10 αλφαριθμητικά και τα αποθηκεύει σε ένα ArrayList. Το πρόγραμμα παραθέτει τρεις (3) διαφορετικές μεθόδους για την διάτρεξη της λίστας α) με χρήση κλασσικού for β) με χρήση enhanced for και γ) με χρήση iterator. Το πρόγραμμα κάνει τα εξής:

  1. εκτυπώνει τη λίστα με χρήση της πρώτης μεθόδου διάτρεξης.
  2. ταξινομεί τη λίστα με χρήση της στατικής μεθόδου Collections.sort.
  3. εκτυπώνει τη λίστα με χρήση της δεύτερης μεθόδου διάτρεξης.
  4. εκτυπώνει τη λίστα με χρήση της τρίτης μεθόδου διάτρεξης.
ArrayListManipulation.java
import java.util.*;
 
public class ArrayListManipulation {
  public static void main(String []args) {
    Random rand = new Random(new Date().getTime());
    ArrayList<String> list = new ArrayList<String>();
    System.out.println("Enter words (max 10):");
    Scanner sc = new Scanner(System.in);
    for(int i=0; i<10; i++) {
      list.add(sc.next());      
    }
    System.out.println("1. "+ArrayList2String1(list));
    Collections.sort(list);
    System.out.println("2. "+ArrayList2String2(list));
    System.out.println("3. "+ArrayList2String3(list));
  }
 
  public static String ArrayList2String1(ArrayList<String> list) {
    String str = "";
    for(int i=0; i<list.size(); i++)
      str += list.get(i) + "   ";
    return str;
  }
 
  public static String ArrayList2String2(ArrayList<String> list) {
    String str = "";
    for(String e : list)
      str += e + "   ";
    return str;
  }
 
  public static String ArrayList2String3(ArrayList<String> list) {
    String str = "";
    Iterator it = list.iterator();
    while(it.hasNext())
      str += it.next()+"   ";
    return str;
  }
}

Παράδειγμα 2

Στο επόμενο παράδειγμα θα προσπαθήσουμε να εντοπίσουμε τα αρχεία με κατάληξη .mp3 που βρίσκονται μέσα σε ένα κατάλογο του filesystem μας και στη συνέχεια θα επιχειρήσουμε να τα αναπαράγουμε με την σειρά παίζοντας 10 sec από το κάθε αρχείο. Το παρακάτω πρόγραμμα δουλεύει μόνο για την έκδοση 8 της 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;
  }  
}

Αρχικά δημιουργούμε ένα ArrayList με τα αρχεία που έχουν κατάληξη .mp3 μέσω της μεθόδου

static ArrayList<File> listMp3(String directory );

Στη συνέχεια από το ArrayList που κατασκευάσαμε, δημιουργούμε για κάθε αρχείο mp3, ένα αντικείμενο τύπου MediaPlayer που θα αναπαράγει το τραγούδι μέσω της μεθόδου

static MediaPlayer createMediaPlayer(String filename);

Όλα τα αντικείμενα του τύπου MediaPlayer που δημιουργήσαμε τα τοποθετούμε μέσα στο ArrayList mpl.

ArrayList<MediaPlayer> mpl = new ArrayList<>();

Στη συνέχεια αναπαράγουμε τα αρχεία ένα-ένα αφαιρώντας τα αντικείμενα του τύπου MediaPlayer από την λίστα.

  while( mpl.size() > 0 ) {
    MediaPlayer player = mpl.remove(0);
    player.play();
    Thread.sleep(10000);
    player.stop();
  }
java/array_list.txt · Last modified: 2018/03/15 14:49 by gthanos