Lista enlazada added.

This commit is contained in:
Chris Cromer 2016-06-25 14:14:17 -04:00
parent e89d581b0a
commit 2f4c70ad4c
9 changed files with 186 additions and 70 deletions

View File

@ -134,6 +134,7 @@ public class ArrayController implements Initializable {
try { try {
boolean exito = array.insertar(Integer.valueOf(valorArray.getText())); boolean exito = array.insertar(Integer.valueOf(valorArray.getText()));
if (exito) { if (exito) {
valorArray.setText("");
generarGrafico(); generarGrafico();
} }
else { else {
@ -179,6 +180,7 @@ public class ArrayController implements Initializable {
if (valorArray.getText() != null && !valorArray.getText().trim().equals("")) { if (valorArray.getText() != null && !valorArray.getText().trim().equals("")) {
boolean exito = array.eliminar(Integer.valueOf(valorArray.getText())); boolean exito = array.eliminar(Integer.valueOf(valorArray.getText()));
if (exito) { if (exito) {
valorArray.setText("");
generarGrafico(); generarGrafico();
} }
else { else {

View File

@ -129,6 +129,7 @@ public class ColaController implements Initializable {
try { try {
if (cola.size() < 10) { if (cola.size() < 10) {
cola.push(Integer.valueOf(valorCola.getText())); cola.push(Integer.valueOf(valorCola.getText()));
valorCola.setText("");
generarGrafico(); generarGrafico();
} }
else { else {

View File

@ -7,6 +7,7 @@ import javafx.scene.Scene;
import javafx.scene.layout.StackPane; import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle; import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.util.Duration; import javafx.util.Duration;
@ -65,6 +66,22 @@ public class Grafico {
destacado = -1; destacado = -1;
} }
/**
* Crear una linea vertical
* @return StackPane: Devolver el stackpane que contiene la linea vertical.
*/
public static StackPane crearLineaVertical() {
Line line = new Line();
line.setStartX(20);
line.setEndX(20);
line.setStartY(0);
line.setEndY(20);
StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(line);
return stackPane;
}
/** /**
* Crear un rectangulo con texto adentro. * Crear un rectangulo con texto adentro.
* @param colores Colores: Los colores para dar color al rectangulo. * @param colores Colores: Los colores para dar color al rectangulo.
@ -111,6 +128,31 @@ public class Grafico {
return stackPane; return stackPane;
} }
/**
* Crear un rectangulo con texto adentro.
* @param colores Colores: Los colores para dar color al rectangulo.
* @param label String: El texto por el ID de fxml.
* @param texto String: El texto a colocar dentro el rectangulo.
* @param tamano int: El tamaño del rectangulo.
* @return StackPane: Devolver el stackpane que contiene el rectangulo y texto.
*/
public static StackPane crearCaja(Colores colores, String label, String texto, int tamano) {
Rectangle rectangle = new Rectangle();
rectangle.setHeight(tamano);
rectangle.setWidth(tamano);
rectangle.setFill(colores.getFondo());
rectangle.setStroke(Color.BLACK);
rectangle.setId("border_" + label);
Text text = new Text();
text.setId("caja_" + label);
text.setStroke(colores.getTexto());
text.setText(texto);
StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(rectangle, text);
return stackPane;
}
/** /**
* Crear un animacion de transicion usando colores que cambian. * Crear un animacion de transicion usando colores que cambian.
* @param rectangle Rectangle: El objeto que desea animar. * @param rectangle Rectangle: El objeto que desea animar.

View File

@ -3,10 +3,26 @@ package cl.cromer.estructuras;
public class ListaEnlazada { public class ListaEnlazada {
private Enlace lista; private Enlace lista;
private int size;
private int tipo;
public ListaEnlazada() { public ListaEnlazada() {
lista = null; lista = null;
} }
public int size() {
return size;
}
public int getTipo() {
return tipo;
}
public void setTipo(int tipo) {
this.tipo = tipo;
}
public Enlace buscar(int llave) { public Enlace buscar(int llave) {
if (this.lista != null) { if (this.lista != null) {
// La lista no es vacia // La lista no es vacia
@ -39,6 +55,7 @@ public class ListaEnlazada {
nueva.setValor(valor); nueva.setValor(valor);
nueva.setSiguente(lista); nueva.setSiguente(lista);
lista = nueva; lista = nueva;
size++;
return true; return true;
} }
else { else {
@ -73,6 +90,7 @@ public class ListaEnlazada {
// Sino cortar esta enlace de la lista // Sino cortar esta enlace de la lista
previo.setSiguente(lista.getSiguente()); previo.setSiguente(lista.getSiguente());
} }
size--;
return true; return true;
} }
else { else {
@ -81,6 +99,26 @@ public class ListaEnlazada {
} }
} }
/**
* Devolver un enlace con su llave y valor.
* @param indice int: El indice que desea ver.
* @return Enlace: El enlace a devolver.
*/
public Enlace getIndice(int indice) {
if (lista != null && indice >= 0 && indice < size()) {
int i = size();
Enlace lista = this.lista;
while (i > indice + 1) {
lista = lista.getSiguente();
i--;
}
return lista;
}
else {
return null;
}
}
// Estructura de enlaces // Estructura de enlaces
public class Enlace { public class Enlace {
private int llave; private int llave;

View File

@ -6,6 +6,7 @@ import javafx.scene.Scene;
import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType; import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog; import javafx.scene.control.Dialog;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.scene.text.Text; import javafx.scene.text.Text;
@ -20,14 +21,18 @@ import java.util.logging.Level;
* @author Chris Cromer * @author Chris Cromer
*/ */
public class ListaEnlazdaController implements Initializable { public class ListaEnlazdaController implements Initializable {
/**
* La caja para ingresar la llave.
*/
@FXML private TextFieldLimited llaveLista;
/** /**
* La caja para ingresar textos. * La caja para ingresar el valor.
*/ */
@FXML private TextFieldLimited valorLista; @FXML private TextFieldLimited valorLista;
/** /**
* Donde poner el contenido de array. * Donde poner el contenido de lista.
*/ */
@FXML private VBox contenidoLista; @FXML private VBox contenidoLista;
@ -47,15 +52,25 @@ public class ListaEnlazdaController implements Initializable {
private ResourceBundle resourceBundle; private ResourceBundle resourceBundle;
/** /**
* El array usado en la aplicación. * La lista enlazada usado en la aplicación.
*/ */
private Array array; private ListaEnlazada listaEnlazada;
/** /**
* Grafico rectangulos. * Tipo de lista enlazada a trabajar.
*/
private ListaEnlazadaTipos listaEnlazadaTipos;
/**
* Grafico rectangulos y lineas.
*/ */
private Grafico grafico; private Grafico grafico;
/**
* Colores por los dibjos.
*/
private Colores colores;
/** /**
* Inicializar todos los datos y dibujar las graficas. * Inicializar todos los datos y dibujar las graficas.
* @param location URL: El URL de fxml en uso. * @param location URL: El URL de fxml en uso.
@ -66,21 +81,15 @@ public class ListaEnlazdaController implements Initializable {
this.resourceBundle = resourceBundle; this.resourceBundle = resourceBundle;
scene = null; scene = null;
Colores colores = new Colores();
for (int i = 0; i < 10; i++) {
contenidoLista.getChildren().addAll(Grafico.crearCaja(colores, String.valueOf(i)));
colores.siguinteColor();
}
} }
/** /**
* Llenar el array con numeros al azar. * Llenar la lista con numeros al azar.
*/ */
@FXML @FXML
protected void botonLlenar() { protected void botonLlenar() {
if (scene == null) { if (scene == null) {
initializeArray(); initializeLista();
} }
Random random = new Random(); Random random = new Random();
@ -88,66 +97,70 @@ public class ListaEnlazdaController implements Initializable {
int minimo = 0; int minimo = 0;
int rango = maximo - minimo + 1; int rango = maximo - minimo + 1;
for (int i = array.size(); i < 10; i++) { for (int i = listaEnlazada.size(); listaEnlazada.size() < 5; i++) {
int numero = random.nextInt(rango) + minimo; int numero = random.nextInt(rango) + minimo;
while (array.buscar(numero) != -1) { while (listaEnlazada.buscar(i) != null) {
numero = random.nextInt(rango) + minimo; i++;
} }
array.insertar(numero); listaEnlazada.insertar(i, numero);
} }
generarGrafico(); generarGrafico();
} }
/** /**
* Vaciar el array de todos los valores. * Vaciar la lista de todos los valores.
*/ */
@FXML @FXML
protected void botonVaciar() { protected void botonVaciar() {
if (scene == null) { if (scene == null) {
initializeArray(); initializeLista();
} }
if (array.isOrdered()) { listaEnlazada = new ListaEnlazada();
array = new Array(10);
array.setOrdered(true);
}
else {
array = new Array(10);
array.setOrdered(false);
}
generarGrafico(); generarGrafico();
} }
/** /**
* Insertar un valor al array y mostrar el codigo en la pantalla. * Insertar un valor a la lista y mostrar el codigo en la pantalla.
*/ */
@FXML @FXML
protected void botonInsertar() { protected void botonInsertar() {
if (scene == null) { if (scene == null) {
initializeArray(); initializeLista();
}
String tipo;
switch (listaEnlazadaTipos.getTipo()) {
case ListaEnlazadaTipos.SIMPLE:
tipo = "Simple";
break;
case ListaEnlazadaTipos.CIRCULAR:
tipo = "Circular";
break;
case ListaEnlazadaTipos.DOBLEMENTE_ENLAZADA:
tipo = "Doblemente";
break;
default:
tipo = "Simple";
} }
// Mostrar el codigo // Mostrar el codigo
String tipo = (array.isOrdered())?"Ordenado":"Simple"; //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/listaEnlazada" + tipo + "/insertar")).useDelimiter("\\Z").next();
String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); //codigoLista.setText(codigoTexto);
codigoLista.setText(codigoTexto);
if (valorLista.getText() != null && !valorLista.getText().trim().equals("")) { if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("") && valorLista.getText() != null && !valorLista.getText().trim().equals("")) {
try { try {
boolean exito = array.insertar(Integer.valueOf(valorLista.getText())); boolean exito = listaEnlazada.insertar(Integer.valueOf(llaveLista.getText()), Integer.valueOf(valorLista.getText()));
if (exito) { if (exito) {
llaveLista.setText("");
valorLista.setText("");
generarGrafico(); generarGrafico();
} }
else { else {
ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE);
Dialog<String> dialog = new Dialog<>(); Dialog<String> dialog = new Dialog<>();
dialog.setTitle(resourceBundle.getString("error")); dialog.setTitle(resourceBundle.getString("error"));
if (array.size() == 10) { dialog.setContentText(resourceBundle.getString("listaLlaveExiste"));
dialog.setContentText(resourceBundle.getString("arrayLleno"));
}
else {
dialog.setContentText(resourceBundle.getString("arrayValorExiste"));
}
dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.getDialogPane().getButtonTypes().add(botonCerrar);
dialog.show(); dialog.show();
} }
@ -164,23 +177,25 @@ public class ListaEnlazdaController implements Initializable {
} }
/** /**
* Eliminar un valor del array si existe y mostrar el codigo en la pantalla. * Eliminar un valor de la lista si existe y mostrar el codigo en la pantalla.
*/ */
@FXML @FXML
protected void botonEliminar() { protected void botonEliminar() {
if (scene == null) { if (scene == null) {
initializeArray(); initializeLista();
} }
// Mostrar el codigo // Mostrar el codigo
String tipo = (array.isOrdered())?"Ordenado":"Simple"; //String tipo = (array.isOrdered())?"Ordenado":"Simple";
String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/eliminar")).useDelimiter("\\Z").next(); //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/eliminar")).useDelimiter("\\Z").next();
codigoLista.setText(codigoTexto); //codigoLista.setText(codigoTexto);
try { try {
if (valorLista.getText() != null && !valorLista.getText().trim().equals("")) { if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("")) {
boolean exito = array.eliminar(Integer.valueOf(valorLista.getText())); boolean exito = listaEnlazada.eliminar(Integer.valueOf(llaveLista.getText()));
if (exito) { if (exito) {
llaveLista.setText("");
valorLista.setText("");
generarGrafico(); generarGrafico();
} }
else { else {
@ -199,27 +214,27 @@ public class ListaEnlazdaController implements Initializable {
} }
/** /**
* Buscar si existe un elemento en el array y mostrar el codigo en la pantalla * Buscar si existe una llave en la lista y mostrar el codigo en la pantalla
* Si existe el valor destacarlo. * Si existe la llave destacarla.
*/ */
@FXML @FXML
protected void botonBuscar() { protected void botonBuscar() {
if (scene == null) { if (scene == null) {
initializeArray(); initializeLista();
} }
// Mostrar el codigo // Mostrar el codigo
String tipo = (array.isOrdered())?"Ordenado":"Simple"; //String tipo = (array.isOrdered())?"Ordenado":"Simple";
String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/buscar")).useDelimiter("\\Z").next(); //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/buscar")).useDelimiter("\\Z").next();
codigoLista.setText(codigoTexto); //codigoLista.setText(codigoTexto);
try { try {
if (valorLista.getText() != null && !valorLista.getText().trim().equals("")) { if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("")) {
int encontrado = array.buscar(Integer.valueOf(valorLista.getText())); ListaEnlazada.Enlace enlace = listaEnlazada.buscar(Integer.valueOf(llaveLista.getText()));
if (encontrado != -1) { if (enlace != null) {
generarGrafico(); generarGrafico();
grafico = new Grafico(scene); grafico = new Grafico(scene);
grafico.destacer(encontrado, Grafico.RECTANGULO); grafico.destacer(enlace.getLlave(), Grafico.RECTANGULO);
} }
else { else {
errorNoEsta(); errorNoEsta();
@ -237,38 +252,37 @@ public class ListaEnlazdaController implements Initializable {
} }
/** /**
* Se muestra un error si la persona no ingresa un valor en el TextField. * Se muestra un error si la persona no ingresa un valor y una llave en los TextField.
*/ */
private void errorNoValor() { private void errorNoValor() {
ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE);
Dialog<String> dialog = new Dialog<>(); Dialog<String> dialog = new Dialog<>();
dialog.setTitle(resourceBundle.getString("error")); dialog.setTitle(resourceBundle.getString("error"));
dialog.setContentText(resourceBundle.getString("arrayNoValor")); dialog.setContentText(resourceBundle.getString("listaNoValor"));
dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.getDialogPane().getButtonTypes().add(botonCerrar);
dialog.show(); dialog.show();
} }
/** /**
* Error cuando el valor no está en el array. * Error cuando la llave no está en la lista.
*/ */
private void errorNoEsta() { private void errorNoEsta() {
ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE);
Dialog<String> dialog = new Dialog<>(); Dialog<String> dialog = new Dialog<>();
dialog.setTitle(resourceBundle.getString("error")); dialog.setTitle(resourceBundle.getString("error"));
dialog.setContentText(resourceBundle.getString("arrayNoEsta")); dialog.setContentText(resourceBundle.getString("listaNoEsta"));
dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.getDialogPane().getButtonTypes().add(botonCerrar);
dialog.show(); dialog.show();
} }
/** /**
* Crear el array de tamaño 10. La scene está usado para saber si es de tipo ordenado o simple segun el ménu. * Crear una lista vacia.
*/ */
private void initializeArray() { private void initializeLista() {
scene = contenidoLista.getScene(); scene = contenidoLista.getScene();
grafico = new Grafico(scene); grafico = new Grafico(scene);
this.array = new Array(10); this.listaEnlazada = new ListaEnlazada();
Array array = (Array) scene.getUserData(); listaEnlazadaTipos = (ListaEnlazadaTipos) scene.getUserData();
this.array.setOrdered(array.isOrdered());
} }
/** /**
@ -276,9 +290,12 @@ public class ListaEnlazdaController implements Initializable {
*/ */
private void generarGrafico() { private void generarGrafico() {
grafico.removerDestacar(); grafico.removerDestacar();
for (int i = 0; i < 10; i++) { colores = new Colores();
Text text = (Text) scene.lookup("#caja_" + String.valueOf(i)); contenidoLista.getChildren().clear();
text.setText(array.getIndice(i)); for (int i = 0; i < listaEnlazada.size(); i++) {
ListaEnlazada.Enlace enlace = listaEnlazada.getIndice(i);
contenidoLista.getChildren().addAll(Grafico.crearCaja(colores, String.valueOf(enlace.getLlave()), String.valueOf(enlace.getLlave()) + " | " + String.valueOf(enlace.getValor()), 50), Grafico.crearLineaVertical());
colores.siguinteColor();
} }
} }
} }

View File

@ -129,6 +129,7 @@ public class PilaController implements Initializable {
try { try {
if (pila.size() < 10) { if (pila.size() < 10) {
pila.push(Integer.valueOf(valorPila.getText())); pila.push(Integer.valueOf(valorPila.getText()));
valorPila.setText("");
generarGrafico(); generarGrafico();
} }
else { else {

View File

@ -56,6 +56,8 @@ cancelar=Cancel
cerrar=Close cerrar=Close
error=Error error=Error
llave=Key:
valor=Value:
llenar=Fill llenar=Fill
vaciar=Empty vaciar=Empty
insertar=Insert insertar=Insert
@ -85,6 +87,10 @@ quickYaOrdenado=The array is already sorted.
mergeYaOrdenado=The array is already sorted. mergeYaOrdenado=The array is already sorted.
listaLlaveExiste=Key already exists.
listaNoEsta=Key does not exist.
listaNoValor=Please input a numeric key and value.
pilaLlena=Value not inserted because the stack is full. pilaLlena=Value not inserted because the stack is full.
pilaVacia=The stack is empty. pilaVacia=The stack is empty.
pilaNoValor=Please input a numeric value. pilaNoValor=Please input a numeric value.

View File

@ -56,6 +56,8 @@ cancelar=Cancelar
cerrar=Cerrar cerrar=Cerrar
error=Error error=Error
llave=Llave:
valor=Valor:
vaciar=Vaciar vaciar=Vaciar
llenar=Llenar llenar=Llenar
insertar=Insertar insertar=Insertar
@ -85,6 +87,10 @@ quickYaOrdenado=El array ya est\u00E1 ordenado.
mergeYaOrdenado=El array ya est\u00E1 ordenado. mergeYaOrdenado=El array ya est\u00E1 ordenado.
listaLlaveExiste=La llave ya existe.
listaNoEsta=La llave no existe.
listaNoValor=Ingresar una llave y valor num\u00E9ricos por favor.
pilaLlena=Valor no fue insertado porque la pila est\u00E1 llena. pilaLlena=Valor no fue insertado porque la pila est\u00E1 llena.
pilaVacia=La pila est\u00E1 vac\u00EDa. pilaVacia=La pila est\u00E1 vac\u00EDa.
pilaNoValor=Ingresar un valor num\u00E9rico por favor. pilaNoValor=Ingresar un valor num\u00E9rico por favor.

View File

@ -18,7 +18,10 @@
<Button text="%insertar" onAction="#botonInsertar" /> <Button text="%insertar" onAction="#botonInsertar" />
<Button text="%eliminar" onAction="#botonEliminar" /> <Button text="%eliminar" onAction="#botonEliminar" />
<Button text="%buscar" onAction="#botonBuscar" /> <Button text="%buscar" onAction="#botonBuscar" />
<TextFieldLimited fx:id="valorLista" maxLength="3" prefWidth="50" /> <Text text="%llave" />
<TextFieldLimited fx:id="llaveLista" maxLength="2" prefWidth="40" />
<Text text="%valor" />
<TextFieldLimited fx:id="valorLista" maxLength="2" prefWidth="40" />
</HBox> </HBox>
<VBox fx:id="contenidoLista" alignment="CENTER" /> <VBox fx:id="contenidoLista" alignment="CENTER" />
</VBox> </VBox>