lunes, 24 de enero de 2011

determinar mi musica favorita en JAVA

En estos largos días y época dura de exámenes, que causalidad que es cuando se me pasan por la cabeza las mejores o mas estúpidas ideas. Y nada mas y nada menos que la formula de como identificar de una lista de reproducción de música por ejemplo. Y dependiendo de una serie de variables, sacar las canciones favoritas ordenarlas de "mas favorita" a la que menos y encima ir reproduciendo aleatoriamente teniendo mas prioridad de salir una canción favorita que una no. Quizá no es del todo cierto que sea o no "favorita", imaginemos que reproduces mil veces una canción el "algoritmo" si así se puede llamar te la tomará como favorita ya que no has echo mas que reproducirla pero... eso no quiere decir que aun estando hay salga a reproducirse la primera siempre si no que intentará ser lo mas variado de entre todas. Imaginemos que la misma canción hace un mes que no la reproduces por que no quieres, pues en cierto modo el nivel de favoritismo bajará. Es un poco difícil explicar todas las posibilidades. aquí paso el código

public class MusicLike {
    int  x, //id canción
         a, // numero de repeticiones
         b, //id autor Se almacena pero no se trata, lo dejo para futuras versiones
         c, //id album Se almacena pero no se trata, lo dejo para futuras versiones
         d, //segundos que tarda la canción
         e, //numero de dias que han pasado desde que está en la lista
         z; //numero favorito
    static int lista[][]=new int[5][7]; //lista de reproducción
    static Vector<Integer> ordenado=new Vector<Integer>(); //se usará para ordenar las canciones y reproducirlas

    public static void main(String[] args) {
        lista[0][0]=1; //x
        lista[0][1]=20; //a
        lista[0][2]=1; //b
        lista[0][3]=2; //c
        lista[0][4]=360; //d
        lista[0][5]=3; //e
        lista[0][6]=0; //z
       
        lista[1][0]=2;
        lista[1][1]=120;
        lista[1][2]=3;
        lista[1][3]=1;
        lista[1][4]=75;
        lista[1][5]=10;
        lista[1][6]=0;
       
        lista[2][0]=3;
        lista[2][1]=503;
        lista[2][2]=2;
        lista[2][3]=0;
        lista[2][4]=60;
        lista[2][5]=2;
        lista[2][6]=0;
       
        lista[3][0]=4; //x
        lista[3][1]=30; //a
        lista[3][2]=0; //b
        lista[3][3]=3; //c
        lista[3][4]=59; //d
        lista[3][5]=4; //e
        lista[3][6]=0; //z
       
        lista[4][0]=4; //x
        lista[4][1]=0; //a
        lista[4][2]=0; //b
        lista[4][3]=3; //c
        lista[4][4]=59; //d
        lista[4][5]=10; //e
        lista[4][6]=0; //z
       
        int[] ordenar=new int[lista.length];
        for(int i=lista.length-1;i>=0;i--){
            lista[i][6]=(int) gusta(i);
            ordenar[i]=lista[i][6];
        }
        Arrays.sort(ordenar);
               
        for(int i=ordenar.length-1;i>=0;i--){
            ordenado.addElement(ordenar[i]);
        }
       
        while (ordenado.size()>1) {
            int x=aleatorio();
            console(ordenado.elementAt(x));
           
            for(int i=0;i<lista.length;i++){
                if(ordenado.elementAt(x)==lista[i][6]){
                    break;
                }
            }
            ordenado.removeElementAt(x);
        }
    }
   
    public static int aleatorio(){
        Random randomGenerator = new Random();
        int x = 0;
            try {
                x=randomGenerator.nextInt(ordenado.size()/2);
            } catch (Exception e) {
                x=randomGenerator.nextInt(ordenado.size());
            }
    return x;}
   
    public static long gusta(int x){
        long gustar=lista[x][6];
        long repetir=media(1);
        gustar+=puntoMedia(x, repetir);
       
        long segundos=media(4);
        gustar+=puntoMedia(x, segundos);
       
        long dias=media(5);
        gustar+=puntoMedia(x, dias);
       
        if(gustar<0)gustar=0;
    return gustar;}
   
    public static int puntoMedia(int x,long media){
        int gustar=0;
        if(lista[x][1]>media){
            gustar+=2;
        }else if(lista[x][1]<(media/2)){
            gustar-=1;
        }
       
    return gustar;}
   
    public static long media(int x){
        long media=0;
        for(int i=lista.length-1;i>=0;i--)
            media+=lista[i][x];
    return media/lista.length;}

    public static void console(Integer view){
        System.out.println(view);
    }
}

Según se me ocurra alguna idea mas la actualizaré. Y cuando tenga tiempo y lo de por finalizado implementaré una interfaz.