Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: leojg en Noviembre 05, 2011, 11:38:08 PM

Título: [SOLUCIONADO] Algoritmo de Ordenamiento
Publicado por: leojg en Noviembre 05, 2011, 11:38:08 PM
Hola, como están?

Miren llevo como 2 semanas tratando de solucionar un problema con un algoritmo que genera el fixture de un campeonato en java.

Osea, que cree equipos, los partidos y las fechas... Bueno, la parte de los partidos y equipos anda exelente. Pero estoy complicado con las fechas... osea, cuando agrega los partidos a las fechas, comienza a funcionar mal.

Para pocos equipos(hasta 4), no hay problema... Pero a medida que aumentan comienza a fallar.

Asique, basicamente lo que necesito es un algoritmo que dado un numero de equipos y sus convinaciones unicas(esto es, cada equipo juega una una sola vez con los otros)... los agrupe de forma tal que todos jueguen solo una vez por fecha y en todas las fechas.

Si necesitan el codigo se los posteo. Saludos y gracias





Título: Re:[ayuda] Algoritmo de Ordenamiento
Publicado por: s00rk en Noviembre 06, 2011, 12:56:04 AM
Pues de hecho se ocupa el codigo de lo que llevas heho para poder adaptar algo a lo tuyo y asi podria ayudartele mas facilmente.
Título: Re:[ayuda] Algoritmo de Ordenamiento
Publicado por: leojg en Noviembre 06, 2011, 10:09:25 AM
Bueno aca dejo el codigo:
Código (java) [Seleccionar]

    private boolean AltaFechas(Fecha objF) {
        if (!this.colFechas.containsValue(objF)) {

            this.colFechas.put(objF.getNombre(), objF);
            return true;
        }
        return false;
    }

    public HashMap<Integer, Equipo> devolverEquipos() {

        return this.colEquipos;

    }

    public void generarPartidosDelCampeonato() {
        ArrayList camp = new ArrayList();

        for (int n = 1; n < this.colEquipos.size(); n++) {
            for (int i = n + 1; i <= this.colEquipos.size(); i++) {
                Partido part = new Partido(this.colEquipos.get(n), this.colEquipos.get(i));
                camp.add(part);
            }
        }
        System.out.println(camp.toString());
        this.asignarFecha(camp, this.crearFechas());

        //return camp;
        //El algoritmo principal
    }

    private void asignarFecha(ArrayList<Partido> campeonato, int nroFechas) {

        if (nroFechas <= 0) {
            return;
        } else {
            for (Partido objP : campeonato) {
                Fecha objF = this.colFechas.get("Fecha " + nroFechas);//Por valor o por referencia??

                if (!objF.esRepetido(objP)) {
                    //Mientras no se repiten partidos en la fecha
                    //siempre se mantendrá el numero correcto de partido por fecha

                    objF.agregarPartido(objP);

                }

            }
            this.asignarFecha(campeonato, --nroFechas);
        }
    }

    private int crearFechas() {
        int nroFechas = this.colEquipos.size() - 1;
        for (int i = 1; i <= nroFechas; i++) {
            Fecha fecha = new Fecha(i);
            this.colFechas.put(fecha.getNombre(), fecha);
        }
        return nroFechas;
    }




este es el esRepetido de la clase Fecha:
Código (java) [Seleccionar]

    public boolean esRepetido(Partido objP) {
        if (this.colPartidos.isEmpty()) {
            return false;
        }
        int flag = 0;
        for (int i = 0; i < this.colPartidos.size(); i++) {
            if (objP.equals(this.colPartidos.get(i))) {
                flag++;
            }
        }
        if (flag > 0) {
            return true;
        }
        return false;//aqui
    }




Y el equals de Partido
Código (java) [Seleccionar]

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Partido objp = (Partido) obj;
        /*
         * aqui lo unico que hay que comprobar es si el partido es el mismo
         * porque si el partido es X vs Y no va a existir Y vs X ya que eso
         * está controlado al generar los partidos del campeonato
         */
        if (objp.objEq1.getNum() == this.objEq1.getNum()
                || objp.objEq2.getNum() == this.objEq2.getNum()
                || objp.objEq1.getNum() == this.objEq2.getNum()
                || objp.objEq2.getNum() == this.objEq1.getNum()) {

            return true;

        }
        return false;
    }