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 ;)

Por Carballude

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

10 comentarios

  1. Seño, seño, tengo una pregunta! :D
    No tengo dudas sobre el programa en sí, pero me asalta una pregunta: ¿de dónde has sacado el idiom de poner un ‘_’ antes de las variables privadas? Aparte de parecerme feo de narices, lo he visto últimamente mucho y me llama la atención…

  2. Pues, estoy razonablemente seguro de que está «mal» usado. Que yo sepa, en Java no se usa.

    En C# se suele nombrar a las variables privadas de clase con un ‘_’ al principio. Los motivos son varios… el primero que, al menos a mi, me resulta más claro y fácil de seguir… pero eso es subjetivo.
    El segundo es que es más sencillo obtener los datos que necesitas en depuración y con completador de código (http://arcware.net/coding-guideline-do-use-an-underscore-for-class-member-variables/).

    Lo cierto es que aquí lo he usado por costumbre más que por otra cosa…

  3. hola, me gustaria saber como hacer un reproductor mp3 con listas pero utilizando Nodos es que tengo un proyecto de la universidad y no se por donde empezar gracias enserio seria de gran ayuda!!

  4. Juan: Creo que voy a necesitar que me aclares eso un poco. ¿Te refieres a que las listas de reproducción puedan contener listas de reproducción?

  5. eejej no, que pena si no me explique bn es un programa para reproducir mp3 que tiene que tener listas de reproduccion pero estas listas las tengo que hacer por medio de nodos. y ps estas listas obviamente tienen que ser circulares y doblemente encadenadas. gracias!!
    y perdon x la molestia.

  6. Hola carballude pues mi problema es ke ecesito hacer un sistema multimedia, esto es que reproduzca audio y video , usando la libreria de java zoom,

    La tarea consiste en crear un programa que permita almacenar informacion de diversos medios, como son
    musica y videos y trabajar con esa informacion. Las operaciones que debe permitir el programa son: dar
    de alta y/o borrar melodas y/o videos, hacer busquedas (de melodas y videos) por genero (por ejemplo,
    \Mostrar las melodas de tal genero») o por ttulo y reproducir melodas.
    No se debe permitir tener elementos duplicados en la coleccion. Tampoco se debe permitir dar de alta
    un elemento si carece de actor y actriz, puede omitir alguno de los dos pero no ambos. El resultado de las
    busquedas es una lista con las melodas/videos solicitados.
    La informacion que se debe tener de la musica, como mnimo, es la siguiente: ttulo de la meloda, nombre
    del interprete, genero, album al que pertenece (puede no tenerlo), duracion. Para las pelculas, ttulo, actor
    principal, actriz principal, genero, duracion, director, a~no de grabacion y formato. Puedes incluir toda la
    informacion que consideres necesaria.
    Para tu tarea necesitas como \datos de entrada» una serie de archivos en cada uno de ellos debe estar
    grabada una meloda. Estos no seran creado desde el programa.
    Para la reproduccion de la musica en MPEG puedes usar una biblioteca que esta en
    http://www.javazoom.net/javalayer/docs/docs1.0/index.html Solo necesitas javazoom.jl.player.Player
    y javazoom.jl.decoder.JavaLayerException

    espero me puedas ayudar mil gracias!!!

  7. Hola, estoy haciendo un reproductor mp3 y java, y quisiera que se pudiera hacer con listas de reproduccion, el problema es que quiero meter en una Jlist todos los mp3 que existen en alguna carpeta, esto lo estoy tratando de hacer con el metodo getSelectedFiles() de la clase JFileChooser pero este metodo me regresa un array de tipo File[], y pues hasta ahi llegue, ya no se como mandar todo eso a mi jlist, lo unico que e podido hacer es mandar un archivo a la vez con el metodo addElement de la clase DefaultListModel, pero para agregar todos los archivos a la vez ahi es donde ya no puedo, agradezco de antemano su ayuda.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *