[SOLUCIONADO] Algoritmo de Ordenamiento

Iniciado por leojg, Noviembre 05, 2011, 11:38:08 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 05, 2011, 11:38:08 PM Ultima modificación: Febrero 08, 2014, 05:25:27 PM por Expermicid
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






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.

Noviembre 06, 2011, 10:09:25 AM #2 Ultima modificación: Abril 18, 2013, 12:52:07 PM por Expermicid
Bueno aca dejo el codigo:
Código: java

    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

    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

    @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;
    }