Table of Contents

Η κλάση ArrayList

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

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

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

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

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

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

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

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

Μέθοδοι

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

Παράδειγμα 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();
  }