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.
Bueno aca dejo el codigo:
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:
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
@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;
}