Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/01/2012, 10:26
Kyokatallama
 
Fecha de Ingreso: enero-2012
Ubicación: Madrid
Mensajes: 15
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Fallo java.lang.StackOverflowError

Mmmmm... La construcción doble se debe a que estaba probando diferentes cosas y olvidé devolverlo a su estado original... :P.

Disculpa, puedes eliminar cualquiera de ellas...


Para n == 1 (caso base) defino:

if (n == 1) {
s.add(new TipoSkyline(Integer.valueOf(c.get(0).getInicio()), (Integer.valueOf(c.get(0).getAltura()))));
}

Para el resto de casos:
else; {
DyV(c, i, m, s1);
DyV(c, m+1, j, s2);
Combinar(s1, s2, s);
}


El algoritmo que intento implementar es un Divide y Venceras.

El main del programa define variables, lee de un archivo de entrada mediante un scanner (fin) y lo mete en una variable ciudad (que contiene el conjunto de edificios). Linea, contendrá la un arralist de salida con el dibujo del skyline.

Los edificios están definidos como clases de 3 parámetros: inicio, fin y altura.
Mientras que la clase TipoSkyline viene definido por 2:Cambio y altura. (Donde cambio indica el punto en que cambia de altura el Skyline).

public static void main(String[] args) throws IOException {
String[] edificio;
ArrayList<edificio> ciudad = new ArrayList<edificio>();
ArrayList<TipoSkyline> linea = new ArrayList<TipoSkyline>();
int temp;

Scanner fin = new Scanner(new File("src/skyline.in"));

while (fin.hasNextLine()) {
String line = fin.nextLine();
edificio = line.split(" ");
ciudad.add(new edificio(Integer.valueOf(edificio[0]),Integer.valueOf(edificio[1]),Integer.valueOf(edificio[2])));
}

temp = ciudad.size();
//LLAMADA INICIAL DEL ALGORITMO RECURSIVO.
DyV(ciudad, 0, temp, linea);
}
Por otro lado, DyV:

public static void DyV(ArrayList<edificio> c, int i, int j, ArrayList<TipoSkyline> s) {

int m,n;
ArrayList<TipoSkyline> s1 = new ArrayList<TipoSkyline>();
ArrayList<TipoSkyline> s2 = new ArrayList<TipoSkyline>();

m = (i + j - 1)/2;
n = j - i + 1;

if (n == 1) {
s.add(new TipoSkyline(Integer.valueOf(c.get(0).getInicio()), (Integer.valueOf(c.get(0).getAltura()))));
}

else; {
DyV(c, i, m, s1);
DyV(c, m+1, j, s2);
Combinar(s1, s2, s);
}
}

Donde considero que el caso base es cuando solo hay un edificio y lo introduce directamente en la salida.
En otro caso, aplicamos DyV a n/2 del arraylist Ciudad y volvemos aplicar DyV. Para que en la ultima llamada se vaya aplicando recursivamente combinar que se encarga de cuadrar cada uno de los solapamientos al ir avanzando en la pila de llamadas...

Los fallos en tiemp ode ejecución aún no he empezado a mirarlos, por lo que el algoritmo puede que este mal.
Pero no puedo avanzar hasta que no solucione estos problemas en tiempo de ejecución...

Gracias CapacProg por molestarte en responderme. Espero haberte dado la información necesaria...
Gracias de nuevo y Feliz 2012.