Usar ArrayList para crear listas de reproducción en Java

Hace algún tiempo publiqué como reproducir música en Java. En ese hilo me pedían ayuda para hacer una lista de reproducción. Lo cierto es que no va más allá de usar alguna estructura de datos, así que pondré una sencilla implementación usando ArrayList.

La aplicación tendrá la siguiente estructura:

  • MusicFile: Clase que encapsula los datos que queremos meter en la lista de reproducción. En este caso “Nombre” y “Ruta”.
  • ListController: Se encargará de lidiar con ArrayList e implementar la funcionalidad necesaria.
  • Program: Básicamente trabaja con ListController e imprime los resultados por pantalla.

MusicFile es sólo un contenedor de datos, así que su código no tiene mucha complicación:

public class MusicFile {
    private String _name;
    private String _path;
    public MusicFile(String name, String path){
        _name = name;
        _path = path;
    }
    public void setName(String name){
        _name = name;
    }
    public String getName(){
        return _name;
    }
    public void setPath(String path){
        _path = path;
    }
    public String getPath(){
        return _path;
    }
    @Override
    public String toString(){
        return "File: " + _name;
    }
}

Lo único interesante es que se ha sobrecargado el método “toString” para que sea más fácil identificar el archivo al mostrarlo por consola.

ListController tendría un código parecido al siguiente:

import java.util.ArrayList;
public class ListController {
    /**
     * Creamos un ArrayList que accepte MusicFiles
     */
    private ArrayList _list;
    /**
     * Este puntero indicará cuál es el siguiente fichero
     * a reproducir
     */
    private int _pointer;
    public ListController(){
        _list = new ArrayList();
        _pointer = -1;
    }
    /**
     * Añade ficheros a la lista de reproducción
     * @param file Fichero que queremos añadir
     */
    public void addFileToPlayList(MusicFile file){
        _list.add(file);
    }
    /**
     * Elimina un archivo de la lista de reproducción
     * @param file Fichero que queremos eliminar
     * @throws java.lang.IllegalArgumentException
     * Se lanza si la lista no contiene ese fichero
     */
    public void removeFileFromPlayList(MusicFile file)
            throws IllegalArgumentException {
        if(!_list.contains(file))
            throw new IllegalArgumentException
                    ("The file is not in the PlayList");
        _list.remove(file);
    }
    /**
     * Obtiene el último fichero reproducido.
     * @return último fichero reproducido.
     */
    public MusicFile getPreviousFile(){
        if(_list.isEmpty())
            return null;
        if(_pointer < 1)
            _pointer = 1;
        --_pointer;
        return _list.get(_pointer);
    }
    /**
     * Obtiene el siguiente fichero que será reproducido
     * @return siguiente fichero
     */
    public MusicFile getNextFile(){
        if(_list.isEmpty())
            return null;
        if(_list.size() < (_pointer+2))
            _pointer = -1;
        ++_pointer;
        return _list.get(_pointer);
    }
}

Realmente lo único importante es darse cuenta que la estructura de datos la mantiene ArrayList (_list) y que sólo tenemos que preocuparnos de _pointer, que será quien nos diga cuál será el próximo fichero a reproducir.

Por último, Program sólo debe servir para ver el funcionamiento del sistema. Le añadiremos tres archivos y le diremos que queremos reproducir “Siguiente, Siguiente, Anterior, Siguiente, Siguiente, Siguiente”. Eso sería 1, 2, 1, 2 ,3 ,1 (si se pide el siguiente del último, devuelve el primero).

El código sería:

public class Program {
    private ListController _listController;
    public Program(){
        _listController = new ListController();
        MusicFile file1 = new MusicFile("File 1", "path1");
        MusicFile file2 = new MusicFile("File 2", "path2");
        MusicFile file3 = new MusicFile("File 3", "path3");
        _listController.addFileToPlayList(file1);
        _listController.addFileToPlayList(file2);
        _listController.addFileToPlayList(file3);
        System.out.println("Next");
        System.out.println(_listController.getNextFile());
        System.out.println("Next");
        System.out.println(_listController.getNextFile());
        System.out.println("Previous");
        System.out.println(_listController.getPreviousFile());
        System.out.println("Next");
        System.out.println(_listController.getNextFile());
        System.out.println("Next");
        System.out.println(_listController.getNextFile());
        System.out.println("Next");
        System.out.println(_listController.getNextFile());
    }
    public static void main(String[] args) {
        new Program();
    }
}

Se crea un ListController, 3 archivos de música y se le añaden. Al pedirle las acciones el resultado es el siguiente:

Next
File: File 1
Next
File: File 2
Previous
File: File 1
Next
File: File 2
Next
File: File 3
Next
File: File 1

Con lo que parece que el sistema funciona :) Si tenéis cualquier duda, ya sabéis donde están los comentarios ;)

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P