Working on arbol.

Changed log system to support log file or console.
This commit is contained in:
Chris Cromer 2016-07-05 10:03:13 -04:00
parent 926b84eef7
commit 5d2bd06d42
6 changed files with 234 additions and 75 deletions

View File

@ -1,10 +1,15 @@
package cl.cromer.estructuras; package cl.cromer.estructuras;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
public class Arbol { public class Arbol {
private ArbolNodo arbol; private ArbolNodo arbol;
private int size; private int size;
private int altura; private int altura;
private int ancho; private int ancho;
private List<List<ArbolNodo>> niveles;
public enum PrimerLado { public enum PrimerLado {
IZQUERDA, IZQUERDA,
@ -15,20 +20,19 @@ public class Arbol {
this.arbol = null; this.arbol = null;
this.altura = 0; this.altura = 0;
this.ancho = 0; this.ancho = 0;
this.niveles = new ArrayList<>();
} }
public boolean insertar(int valor) { public boolean insertar(int valor) {
if (this.arbol == null) { if (this.arbol == null) {
arbol = new ArbolNodo(valor); arbol = new ArbolNodo(valor, null);
arbol.setY(1); setAncho(1);
arbol.setX(1); setAltura(1);
ancho = 1;
altura = 1;
return true; return true;
} }
else { else {
PrimerLado primerLado = null; PrimerLado primerLado = null;
ArbolNodo nuevo = new ArbolNodo(valor); ArbolNodo nuevo = new ArbolNodo(valor, null);
ArbolNodo actual = arbol; ArbolNodo actual = arbol;
ArbolNodo padre; ArbolNodo padre;
while (true) { while (true) {
@ -41,20 +45,23 @@ public class Arbol {
// Izquerda // Izquerda
if (primerLado == null) { if (primerLado == null) {
primerLado = PrimerLado.IZQUERDA; primerLado = PrimerLado.IZQUERDA;
nuevo.setX(1);
} }
else {
nuevo.setX(nuevo.getX() + 1);
}
nuevo.setY(nuevo.getY() + 1);
actual = actual.getIzquerda(); actual = actual.getIzquerda();
if (actual == null) { if (actual == null) {
nuevo.setPadre(padre);
padre.setIzquerda(nuevo); padre.setIzquerda(nuevo);
size++; size++;
if (primerLado == PrimerLado.IZQUERDA) { if (primerLado == PrimerLado.IZQUERDA) {
ancho++; setAncho(getAncho() + 1);
} }
setAltura(getAlturaRecursivo(arbol)); setAltura(getAlturaRecursivo(arbol));
niveles = new ArrayList<>();
for (int i = 0; i < getAltura(); i++) {
niveles.add(new ArrayList<>());
}
getNivelesRecursivo(arbol);
return true; return true;
} }
} }
@ -62,20 +69,23 @@ public class Arbol {
// Derecha // Derecha
if (primerLado == null) { if (primerLado == null) {
primerLado = PrimerLado.DERECHA; primerLado = PrimerLado.DERECHA;
nuevo.setX(1);
} }
else {
nuevo.setX(nuevo.getX() + 1);
}
nuevo.setY(nuevo.getY() + 1);
actual = actual.getDerecha(); actual = actual.getDerecha();
if (actual == null) { if (actual == null) {
nuevo.setPadre(padre);
padre.setDerecha(nuevo); padre.setDerecha(nuevo);
size++; size++;
if (primerLado == PrimerLado.DERECHA) { if (primerLado == PrimerLado.DERECHA) {
ancho++; setAncho(getAncho() + 1);
} }
setAltura(getAlturaRecursivo(arbol)); setAltura(getAlturaRecursivo(arbol));
niveles = new ArrayList<>();
for (int i = 0; i < getAltura(); i++) {
niveles.add(new ArrayList<>());
}
getNivelesRecursivo(arbol);
return true; return true;
} }
} }
@ -99,12 +109,17 @@ public class Arbol {
this.altura = altura; this.altura = altura;
} }
public List<List<ArbolNodo>> getNiveles() {
return niveles;
}
public int getAncho() { public int getAncho() {
return ancho; return ancho;
} }
public void setAncho(int ancho) { public void setAncho(int ancho) {
this.ancho = ancho; //this.ancho = ancho;
this.ancho = (int) Math.pow(2, altura - 1) - 1;
} }
public int getAlturaRecursivo(ArbolNodo nodo) { public int getAlturaRecursivo(ArbolNodo nodo) {
@ -115,14 +130,56 @@ public class Arbol {
int alturaIzquerda = getAlturaRecursivo(nodo.getIzquerda()); int alturaIzquerda = getAlturaRecursivo(nodo.getIzquerda());
int alturaDercha = getAlturaRecursivo(nodo.getDerecha()); int alturaDercha = getAlturaRecursivo(nodo.getDerecha());
if (alturaIzquerda > alturaDercha) { if (alturaIzquerda > alturaDercha) {
nodo.setNivel(alturaIzquerda);
return (alturaIzquerda + 1); return (alturaIzquerda + 1);
} }
else { else {
nodo.setNivel(alturaDercha);
return (alturaDercha + 1); return (alturaDercha + 1);
} }
} }
} }
public int getNivelesRecursivo(ArbolNodo nodo) {
if (nodo == null) {
return 0;
}
else {
try {
int alturaIzquerda = getNivelesRecursivo(nodo.getIzquerda());
int alturaDerecha = getNivelesRecursivo(nodo.getDerecha());
if (alturaIzquerda > alturaDerecha) {
if (!niveles.get(niveles.size() - alturaIzquerda - 1).contains(nodo)) {
niveles.get(niveles.size() - alturaIzquerda - 1).add(nodo);
}
if (nodo.getDerecha() == null) {
niveles.get(niveles.size() - nodo.getNivel() - 1).add(null);
}
if (nodo.getIzquerda() == null) {
niveles.get(niveles.size() - nodo.getNivel() - 1).add(null);
}
return (alturaIzquerda + 1);
}
else {
if (!niveles.get(niveles.size() - alturaDerecha - 1).contains(nodo)) {
niveles.get(niveles.size() - alturaDerecha - 1).add(nodo);
}
if (nodo.getDerecha() == null) {
niveles.get(niveles.size() - nodo.getNivel() - 1).add(null);
}
if (nodo.getIzquerda() == null) {
niveles.get(niveles.size() - nodo.getNivel() - 1).add(null);
}
return (alturaDerecha + 1);
}
}
catch (Exception exception) {
Logs.log(Level.SEVERE, exception);
return 0;
}
}
}
/** /**
* Esta clase contiene los tipos de arboles. * Esta clase contiene los tipos de arboles.
* *

View File

@ -8,8 +8,8 @@ import javafx.scene.layout.GridPane;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import java.net.URL; import java.net.URL;
import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Stack;
/** /**
* Esta clase es para controlar todos la interfaz de Arbol. * Esta clase es para controlar todos la interfaz de Arbol.
@ -70,11 +70,23 @@ public class ArbolController implements Initializable {
// TODO: Remove this // TODO: Remove this
arbol = new Arbol(); arbol = new Arbol();
/*arbol.insertar(50);
arbol.insertar(25);
arbol.insertar(75);
arbol.insertar(35);
arbol.insertar(15);*/
arbol.insertar(5); arbol.insertar(5);
arbol.insertar(4); arbol.insertar(4);
arbol.insertar(3); arbol.insertar(3);
arbol.insertar(2); arbol.insertar(2);
arbol.insertar(1); arbol.insertar(1);
arbol.insertar(6);
arbol.insertar(7);
arbol.insertar(8);
arbol.insertar(9);
} }
/** /**
@ -125,10 +137,37 @@ public class ArbolController implements Initializable {
Arbol.Tipos tipos = (Arbol.Tipos) scene.getUserData(); Arbol.Tipos tipos = (Arbol.Tipos) scene.getUserData();
} }
private void generarGrafico() {
grafico.removerDestacar();
Node node = contenidoArbol.getChildren().get(0);
contenidoArbol.getChildren().clear();
contenidoArbol.getChildren().add(0, node);
List<List<ArbolNodo>> niveles = arbol.getNiveles();
Colores colores = new Colores();
int k = niveles.get(niveles.size() - 1).size();
for (int i = niveles.size() - 1; i >= 0 ; i--) {
int l = k - niveles.get(i).size();
if (i != niveles.size() - 1) {
l--;
}
for (int j = 0; j < niveles.get(i).size(); j++) {
contenidoArbol.add(Grafico.crearCirculo(colores, j + "_" + i), l, i);
colores.siguinteColor();
if (niveles.get(i).get(j) != null) {
Text text = (Text) scene.lookup("#texto_" + j + "_" + i);
text.setText(String.valueOf(niveles.get(i).get(j).getValor()));
}
l++;
}
}
}
/** /**
* Poner los valores en el grafico. * Poner los valores en el grafico.
*/ */
private void generarGrafico() { /*private void generarGrafico() {
grafico.removerDestacar(); grafico.removerDestacar();
Node node = contenidoArbol.getChildren().get(0); Node node = contenidoArbol.getChildren().get(0);
contenidoArbol.getChildren().clear(); contenidoArbol.getChildren().clear();
@ -198,5 +237,5 @@ public class ArbolController implements Initializable {
while(!localStack.isEmpty()) while(!localStack.isEmpty())
globalStack.push( localStack.pop() ); globalStack.push( localStack.pop() );
} }
} }*/
} }

View File

@ -1,20 +1,26 @@
package cl.cromer.estructuras; package cl.cromer.estructuras;
final public class ArbolNodo { final public class ArbolNodo {
private ArbolNodo padre;
private ArbolNodo izquerda; private ArbolNodo izquerda;
private ArbolNodo derecha; private ArbolNodo derecha;
private int valor; private int valor;
private int y; private int nivel;
private int x;
private Desde desde;
public ArbolNodo(int valor) { public ArbolNodo(int valor, ArbolNodo padre) {
this.padre = padre;
this.izquerda = null; this.izquerda = null;
this.derecha = null; this.derecha = null;
this.valor = valor; this.valor = valor;
this.y = 0; this.nivel = 1;
this.x = 0; }
this.desde = Desde.RAIZ;
public ArbolNodo getPadre() {
return padre;
}
public void setPadre(ArbolNodo padre) {
this.padre = padre;
} }
public ArbolNodo getIzquerda() { public ArbolNodo getIzquerda() {
@ -37,37 +43,11 @@ final public class ArbolNodo {
return valor; return valor;
} }
public int getY() { public int getNivel() {
return y; return nivel;
} }
public void setY(int y) { public void setNivel(int nivel) {
if (y >= 0) { this.nivel = nivel;
this.y = y;
}
}
public int getX() {
return x;
}
public void setX(int x) {
if (x >= 0) {
this.x = x;
}
}
public Desde getDesde() {
return desde;
}
public void setDesde(Desde desde) {
this.desde = desde;
}
public enum Desde {
RAIZ,
IQUERDA,
DERECHA
} }
} }

View File

@ -1,6 +1,8 @@
package cl.cromer.estructuras; package cl.cromer.estructuras;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.FileHandler; import java.util.logging.FileHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -12,6 +14,24 @@ import java.util.logging.SimpleFormatter;
* @author Chris Cromer * @author Chris Cromer
*/ */
public class Logs { public class Logs {
/**
* Estado de depuración.
*/
static final public boolean DEBUG = true;
/**
* Tipos de depuración.
*/
private enum DEBUG_TIPOS {
ARCHIVO,
CONSOLA
}
/**
* Tipo de depuración a usar.
*/
static final public DEBUG_TIPOS DEBUG_TIPO = DEBUG_TIPOS.ARCHIVO;
/** /**
* Nombre de archivo para guardar los logs. * Nombre de archivo para guardar los logs.
*/ */
@ -22,33 +42,78 @@ public class Logs {
*/ */
static final public String LOGNAME = "EDD"; static final public String LOGNAME = "EDD";
public FileHandler fileHandler;
/** /**
* Crear un logger usando {@value #LOGNAME}. Guardar los logs en el archivo de {@value #LOGFILE}. Pero solo logear si Main.DEBUG es vardad. * Crear un logger usando {@value #LOGNAME}. Guardar los logs en el archivo de {@value #LOGFILE}. Pero solo logear si {@value #DEBUG} es vardad.
*/ */
public Logs() { public Logs() {
if (Main.DEBUG) { if (DEBUG && DEBUG_TIPO == DEBUG_TIPOS.ARCHIVO) {
Logger logger = Logger.getLogger(LOGNAME); Logger logger = Logger.getLogger(LOGNAME);
try { try {
FileHandler fileHandler = new FileHandler(LOGFILE, true); fileHandler = new FileHandler(LOGFILE, true);
logger.addHandler(fileHandler); logger.addHandler(fileHandler);
SimpleFormatter formatter = new SimpleFormatter(); SimpleFormatter formatter = new SimpleFormatter();
fileHandler.setFormatter(formatter); fileHandler.setFormatter(formatter);
} }
catch (SecurityException | IOException e) { catch (SecurityException | IOException exception) {
e.printStackTrace(); exception.printStackTrace();
} }
} }
} }
/** /**
* Agregar un log al logger. * Cerrar el archivo.
*/
public void close() {
if (DEBUG && DEBUG_TIPO == DEBUG_TIPOS.ARCHIVO) {
if (fileHandler != null) {
fileHandler.close();
}
}
}
/**
* Agregar un log al logger con un mensaje.
* *
* @param level Level: El tipo de error o mensaje que ha sido generado. * @param level Level: El tipo de error o mensaje que ha sido generado.
* @param mensaje String: El mensaje de lo que pasó. * @param mensaje String: El mensaje de lo que pasó.
*/ */
static public void log(Level level, String mensaje) { static public void log(Level level, String mensaje) {
if (Main.DEBUG) { if (DEBUG) {
Logger.getLogger(LOGNAME).log(level, mensaje); if (DEBUG_TIPO == DEBUG_TIPOS.ARCHIVO) {
Logger.getLogger(LOGNAME).log(level, mensaje);
}
else {
System.out.println(mensaje);
}
}
}
/**
* Agregar un log al logger y agregar el stack trace.
*
* @param level Level: El tipo de error o mensaje que ha sido generado.
* @param exception String: El mensaje de lo que pasó.
*/
static public void log(Level level, Exception exception) {
if (DEBUG) {
if (DEBUG_TIPO == DEBUG_TIPOS.ARCHIVO) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
exception.printStackTrace(printWriter);
Logger.getLogger(LOGNAME).log(level, stringWriter.toString());
printWriter.close();
try {
stringWriter.close();
}
catch (IOException ioexception) {
Logs.log(Level.SEVERE, ioexception);
}
}
else {
exception.printStackTrace();
}
} }
} }
} }

View File

@ -26,9 +26,9 @@ import java.util.logging.Level;
*/ */
public class Main extends Application { public class Main extends Application {
/** /**
* Estado de depuración. * El logger.
*/ */
static final public boolean DEBUG = true; static private Logs logs;
/** /**
* Crear el stage y la scene para la aplicación grafica. * Crear el stage y la scene para la aplicación grafica.
@ -61,14 +61,26 @@ public class Main extends Application {
stage.show(); stage.show();
} }
@Override
public void stop() {
try {
super.stop();
}
catch (Exception exception) {
Logs.log(Level.SEVERE, exception);
}
logs.close();
}
/** /**
* Inicilizar el logeo y lanzar la interfaz grafica. * Inicilizar el logeo y lanzar la interfaz grafica.
* *
* @param args String[]: Argumentos desde la consola. * @param args String[]: Argumentos desde la consola.
*/ */
public static void main(String args[]) { public static void main(String args[]) {
if (DEBUG) { if (Logs.DEBUG) {
new Logs(); logs = new Logs();
} }
launch(args); launch(args);
@ -81,8 +93,14 @@ public class Main extends Application {
* @param clase Class: La clase usado para abrir el Stream. * @param clase Class: La clase usado para abrir el Stream.
*/ */
static public void setIcon(Dialog dialog, Class clase) { static public void setIcon(Dialog dialog, Class clase) {
Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow(); try {
stage.getIcons().add(new Image(clase.getResourceAsStream("/cl/cromer/estructuras/images/icon.png"))); Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
stage.getIcons().add(new Image(clase.getResourceAsStream("/cl/cromer/estructuras/images/icon.png")));
}
catch (Exception exception) {
// El icono no está, no es tan critico.
Logs.log(Level.WARNING, exception);
}
} }
/** /**

View File

@ -356,7 +356,7 @@ public class MenuController extends VBox implements Initializable {
catch (IOException exception) { catch (IOException exception) {
// Este error es fatal, hay que cerrar la aplicación. // Este error es fatal, hay que cerrar la aplicación.
Logs.log(Level.SEVERE, "No se pudo abrir el archivo de fxml."); Logs.log(Level.SEVERE, "No se pudo abrir el archivo de fxml.");
Logs.log(Level.SEVERE, exception.getMessage()); Logs.log(Level.SEVERE, exception);
stage.close(); stage.close();
} }
@ -373,7 +373,7 @@ public class MenuController extends VBox implements Initializable {
catch (IOException exception) { catch (IOException exception) {
// Este error es fatal, hay que cerrar la aplicación. // Este error es fatal, hay que cerrar la aplicación.
Logs.log(Level.SEVERE, "No se pudo abrir el archivo de fxml."); Logs.log(Level.SEVERE, "No se pudo abrir el archivo de fxml.");
Logs.log(Level.SEVERE, exception.getMessage()); Logs.log(Level.SEVERE, exception);
stage.close(); stage.close();
} }
} }