Fixed bug in removing a highlighted element.

Added comments.
This commit is contained in:
Chris Cromer 2016-07-03 11:17:17 -04:00
parent 4ac689ec15
commit 71bf0201e6
3 changed files with 506 additions and 406 deletions

View File

@ -25,428 +25,439 @@ import java.util.List;
* @author Chris Cromer * @author Chris Cromer
*/ */
public class Grafico { public class Grafico {
/** /**
* Duración de la animación. * Duración de la animación.
*/ */
static final public int DURACION = 150; static final public int DURACION = 150;
/**
* Tipo de dibujo rectuangular.
*/
static final public int RECTANGULO = 0;
/**
* Tipo de dibujo circular.
*/
static final public int CIRCULO = 1;
/**
* Tipo de dibjuo texto
*/
static final public int TEXTO = 2;
/**
* La escena donde está cosas graficas.
*/
final private Scene scene;
/**
* Los elementos destacados.
*/
final private List<Destacados> destacados;
/** /**
* Graficar una escena. * Tipo de dibujo rectuangular.
* */
* @param scene La scene a destacar. static final public int RECTANGULO = 0;
*/
public Grafico(Scene scene) {
this.scene = scene;
destacados = new ArrayList<>();
}
/** /**
* Crear una flecha que apunta por abajo. * Tipo de dibujo circular.
* */
* @return StackPane: Devolver el stackpane que contiene la flecha. static final public int CIRCULO = 1;
*/
public static StackPane crearFlechaAbajo() {
Polygon polygon = new Polygon();
polygon.getPoints().addAll(
0.0, 0.0,
10.0, 0.0,
5.0, 10.0
);
StackPane stackPane = new StackPane(); /**
stackPane.getChildren().addAll(polygon); * Tipo de dibjuo texto
return stackPane; */
} static final public int TEXTO = 2;
/** /**
* Crear una flecha que apunta por arriba. * La escena donde está cosas graficas.
* */
* @return StackPane: Devolver el stackpane que contiene la flecha. final private Scene scene;
*/
public static StackPane crearFlechaArriba() {
Polygon polygon = new Polygon();
polygon.getPoints().addAll(
5.0, 0.0,
0.0, 10.0,
10.0, 10.0
);
StackPane stackPane = new StackPane(); /**
stackPane.getChildren().addAll(polygon); * Los elementos destacados.
return stackPane; */
} final private List<Destacados> destacados;
/** /**
* Crear una linea vertical. * Graficar una escena.
* *
* @return StackPane: Devolver el stackpane que contiene la linea vertical. * @param scene La scene a destacar.
*/ */
public static StackPane crearLineaVertical() { public Grafico(Scene scene) {
Line line = new Line(); this.scene = scene;
line.setStartX(20); destacados = new ArrayList<>();
line.setEndX(20); }
line.setStartY(0);
line.setEndY(20);
StackPane stackPane = new StackPane(); /**
stackPane.getChildren().addAll(line); * Crear una flecha que apunta por abajo.
return stackPane; *
} * @return StackPane: Devolver el stackpane que contiene la flecha.
*/
public static StackPane crearFlechaAbajo() {
Polygon polygon = new Polygon();
polygon.getPoints().addAll(
0.0, 0.0,
10.0, 0.0,
5.0, 10.0
);
/** StackPane stackPane = new StackPane();
* Crear la linea circular con flecha. stackPane.getChildren().addAll(polygon);
* return stackPane;
* @param cajas int: La cantidad de cajas que están. }
* @return StackPane: Devolver el stackpane que contiene la linea horizontal.
*/
public static Pane crearLineaCircular(int cajas) {
int height = (cajas - 1) * (40 + 20 + 10);
height = height + 20 + 10;
Line top = new Line(); /**
top.setStartY(20); * Crear una flecha que apunta por arriba.
top.setEndY(20); *
top.setStartX(0); * @return StackPane: Devolver el stackpane que contiene la flecha.
top.setEndX(20); */
public static StackPane crearFlechaArriba() {
Polygon polygon = new Polygon();
polygon.getPoints().addAll(
5.0, 0.0,
0.0, 10.0,
10.0, 10.0
);
Polygon flechaDerecha = new Polygon(); StackPane stackPane = new StackPane();
flechaDerecha.getPoints().addAll( stackPane.getChildren().addAll(polygon);
10.0, 15.0, return stackPane;
20.0, 20.0, }
10.0, 25.0
);
Line vertical = new Line(); /**
vertical.setStartY(20); * Crear una linea vertical.
vertical.setEndY(height); *
* @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);
Line bottom = new Line(); StackPane stackPane = new StackPane();
bottom.setStartY(height); stackPane.getChildren().addAll(line);
bottom.setEndY(height); return stackPane;
bottom.setStartX(0); }
bottom.setEndX(20);
/**
* Crear la linea circular con flecha.
*
* @param cajas int: La cantidad de cajas que están.
*
* @return StackPane: Devolver el stackpane que contiene la linea horizontal.
*/
public static Pane crearLineaCircular(int cajas) {
int height = (cajas - 1) * (40 + 20 + 10);
height = height + 20 + 10;
Line top = new Line();
top.setStartY(20);
top.setEndY(20);
top.setStartX(0);
top.setEndX(20);
Polygon flechaDerecha = new Polygon();
flechaDerecha.getPoints().addAll(
10.0, 15.0,
20.0, 20.0,
10.0, 25.0
);
Line vertical = new Line();
vertical.setStartY(20);
vertical.setEndY(height);
Line bottom = new Line();
bottom.setStartY(height);
bottom.setEndY(height);
bottom.setStartX(0);
bottom.setEndX(20);
Pane stackPane = new Pane(); Pane stackPane = new Pane();
stackPane.getChildren().addAll(top, flechaDerecha, vertical, bottom); stackPane.getChildren().addAll(top, flechaDerecha, vertical, bottom);
return stackPane; return stackPane;
} }
/** /**
* Crear un rectangulo. * Crear un rectangulo.
* *
* @param colores Colores: Los colores para dar color al rectangulo. * @param colores Colores: Los colores para dar color al rectangulo.
* @param label String: El texto por el ID de fxml. * @param label String: El texto por el ID de fxml.
* @return StackPane: Devolver el stackpane que contiene el rectangulo y texto. *
*/ * @return StackPane: Devolver el stackpane que contiene el rectangulo y texto.
public static StackPane crearCaja(Colores colores, String label) { */
Rectangle rectangle = new Rectangle(); public static StackPane crearCaja(Colores colores, String label) {
rectangle.setHeight(40); Rectangle rectangle = new Rectangle();
rectangle.setWidth(40); rectangle.setHeight(40);
rectangle.setFill(colores.getFondo()); rectangle.setWidth(40);
rectangle.setStroke(Color.BLACK); rectangle.setFill(colores.getFondo());
rectangle.setId("caja_" + label); rectangle.setStroke(Color.BLACK);
Text text = new Text(); rectangle.setId("caja_" + label);
text.setId("texto_" + label); Text text = new Text();
text.setStroke(colores.getTexto()); text.setId("texto_" + label);
text.setStroke(colores.getTexto());
StackPane stackPane = new StackPane(); StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(rectangle, text); stackPane.getChildren().addAll(rectangle, text);
return stackPane; 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.
* @param label String: El texto por el ID de fxml. * @param label String: El texto por el ID de fxml.
* @param texto String: El texto a colocar dentro el rectangulo. * @param texto String: El texto a colocar dentro el rectangulo.
* @return StackPane: Devolver el stackpane que contiene el rectangulo y texto. *
*/ * @return StackPane: Devolver el stackpane que contiene el rectangulo y texto.
public static StackPane crearCaja(Colores colores, String label, String texto) { */
Rectangle rectangle = new Rectangle(); public static StackPane crearCaja(Colores colores, String label, String texto) {
rectangle.setHeight(40); Rectangle rectangle = new Rectangle();
rectangle.setWidth(40); rectangle.setHeight(40);
rectangle.setFill(colores.getFondo()); rectangle.setWidth(40);
rectangle.setStroke(Color.BLACK); rectangle.setFill(colores.getFondo());
rectangle.setId("caja_" + label); rectangle.setStroke(Color.BLACK);
Text text = new Text(); rectangle.setId("caja_" + label);
text.setId("texto_" + label); Text text = new Text();
text.setStroke(colores.getTexto()); text.setId("texto_" + label);
text.setText(texto); text.setStroke(colores.getTexto());
text.setText(texto);
StackPane stackPane = new StackPane(); StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(rectangle, text); stackPane.getChildren().addAll(rectangle, text);
return stackPane; return stackPane;
} }
/** /**
* Crear 3 rectangulos. * Crear 3 rectangulos.
* *
* @param colores Colores: Los colores para dar color a los rectangulos. * @param colores Colores: Los colores para dar color a los rectangulos.
* @param label String: El texto por el ID de fxml. * @param label String: El texto por el ID de fxml.
* @return StackPane: Devolver el stackpane que contiene los rectangulos y textos. *
*/ * @return StackPane: Devolver el stackpane que contiene los rectangulos y textos.
public static StackPane crearHashCajas(Colores colores, String label) { */
Rectangle rectangle = new Rectangle(); public static StackPane crearHashCajas(Colores colores, String label) {
rectangle.setHeight(40); Rectangle rectangle = new Rectangle();
rectangle.setWidth(40); rectangle.setHeight(40);
rectangle.setFill(colores.getFondo()); rectangle.setWidth(40);
rectangle.setStroke(Color.BLACK); rectangle.setFill(colores.getFondo());
rectangle.setId("indice_caja_" + label); rectangle.setStroke(Color.BLACK);
Text text = new Text(); rectangle.setId("indice_caja_" + label);
text.setId("indice_texto_" + label); Text text = new Text();
text.setStroke(colores.getTexto()); text.setId("indice_texto_" + label);
text.setStroke(colores.getTexto());
StackPane stackPane1 = new StackPane(); StackPane stackPane1 = new StackPane();
stackPane1.getChildren().addAll(rectangle, text); stackPane1.getChildren().addAll(rectangle, text);
rectangle = new Rectangle(); rectangle = new Rectangle();
rectangle.setHeight(40); rectangle.setHeight(40);
rectangle.setWidth(120); rectangle.setWidth(120);
rectangle.setFill(colores.getFondo()); rectangle.setFill(colores.getFondo());
rectangle.setStroke(Color.BLACK); rectangle.setStroke(Color.BLACK);
rectangle.setId("llave_caja_" + label); rectangle.setId("llave_caja_" + label);
text = new Text(); text = new Text();
text.setId("llave_texto_" + label); text.setId("llave_texto_" + label);
text.setStroke(colores.getTexto()); text.setStroke(colores.getTexto());
StackPane stackPane2 = new StackPane(); StackPane stackPane2 = new StackPane();
stackPane2.getChildren().addAll(rectangle, text); stackPane2.getChildren().addAll(rectangle, text);
rectangle = new Rectangle(); rectangle = new Rectangle();
rectangle.setHeight(40); rectangle.setHeight(40);
rectangle.setWidth(40); rectangle.setWidth(40);
rectangle.setFill(colores.getFondo()); rectangle.setFill(colores.getFondo());
rectangle.setStroke(Color.BLACK); rectangle.setStroke(Color.BLACK);
rectangle.setId("valor_caja_" + label); rectangle.setId("valor_caja_" + label);
text = new Text(); text = new Text();
text.setId("valor_texto_" + label); text.setId("valor_texto_" + label);
text.setStroke(colores.getTexto()); text.setStroke(colores.getTexto());
StackPane stackPane3 = new StackPane(); StackPane stackPane3 = new StackPane();
stackPane3.getChildren().addAll(rectangle, text); stackPane3.getChildren().addAll(rectangle, text);
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.getChildren().addAll(stackPane1, stackPane2, stackPane3); hBox.getChildren().addAll(stackPane1, stackPane2, stackPane3);
hBox.setAlignment(Pos.TOP_CENTER); hBox.setAlignment(Pos.TOP_CENTER);
StackPane stackPane = new StackPane(); StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(hBox); stackPane.getChildren().addAll(hBox);
return stackPane; return stackPane;
} }
/** /**
* Destacar un elemento * Destacar un elemento
* *
* @param id int: El indice a destacar. * @param id int: El indice a destacar.
* @param tipo int: El tipo de objeto a destacar, {@value #RECTANGULO}, {@value #CIRCULO} o {@value #TEXTO} * @param tipo int: El tipo de objeto a destacar, {@value #RECTANGULO}, {@value #CIRCULO} o {@value #TEXTO}
*/ */
public void destacar(String id, int tipo) { public void destacar(String id, int tipo) {
if (tipo != RECTANGULO && tipo != CIRCULO && tipo != TEXTO) { if (tipo != RECTANGULO && tipo != CIRCULO && tipo != TEXTO) {
return; return;
} }
Colores colores = new Colores(); Colores colores = new Colores();
Rectangle rectangle = null; Rectangle rectangle = null;
Circle circle = null; Circle circle = null;
Text text = null; Text text = null;
if (tipo == RECTANGULO) { if (tipo == RECTANGULO) {
rectangle = (Rectangle) scene.lookup(id); rectangle = (Rectangle) scene.lookup(id);
} }
else if (tipo == CIRCULO) { else if (tipo == CIRCULO) {
circle = (Circle) scene.lookup(id); circle = (Circle) scene.lookup(id);
} }
else { else {
text = (Text) scene.lookup(id); text = (Text) scene.lookup(id);
} }
PauseTransition changeColor[] = new PauseTransition[Colores.MAX_COLORS]; PauseTransition changeColor[] = new PauseTransition[Colores.MAX_COLORS];
for (int i = 0; i < Colores.MAX_COLORS; i++) { for (int i = 0; i < Colores.MAX_COLORS; i++) {
if (tipo == RECTANGULO) { if (tipo == RECTANGULO) {
changeColor[i] = createPauseTransition(rectangle, colores.getFondo()); changeColor[i] = createPauseTransition(rectangle, colores.getFondo());
} }
else if (tipo == CIRCULO) { else if (tipo == CIRCULO) {
changeColor[i] = createPauseTransition(circle, colores.getFondo()); changeColor[i] = createPauseTransition(circle, colores.getFondo());
} }
else { else {
changeColor[i] = createPauseTransition(text, colores.getTexto()); changeColor[i] = createPauseTransition(text, colores.getTexto());
} }
colores.siguinteColor(); colores.siguinteColor();
} }
if (tipo == RECTANGULO) { if (tipo == RECTANGULO) {
destacados.add(new Destacados(tipo, id, (Color) rectangle.getFill(), new SequentialTransition(changeColor))); destacados.add(new Destacados(tipo, id, (Color) rectangle.getFill(), new SequentialTransition(changeColor)));
} }
else if (tipo == CIRCULO) { else if (tipo == CIRCULO) {
destacados.add(new Destacados(tipo, id, (Color) circle.getFill(), new SequentialTransition(changeColor))); destacados.add(new Destacados(tipo, id, (Color) circle.getFill(), new SequentialTransition(changeColor)));
} }
else { else {
destacados.add(new Destacados(tipo, id, (Color) text.getStroke(), new SequentialTransition(changeColor))); destacados.add(new Destacados(tipo, id, (Color) text.getStroke(), new SequentialTransition(changeColor)));
} }
destacados.get(destacados.size() - 1).getSequentialTransition().setCycleCount(Animation.INDEFINITE); destacados.get(destacados.size() - 1).getSequentialTransition().setCycleCount(Animation.INDEFINITE);
destacados.get(destacados.size() - 1).getSequentialTransition().play(); destacados.get(destacados.size() - 1).getSequentialTransition().play();
} }
/** /**
* 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.
* @param colorBackground Color: Color del fondo de destacar. * @param colorBackground Color: Color del fondo de destacar.
* *
* @return PauseTransition: La transition creado con los elementos y colores. * @return PauseTransition: La transition creado con los elementos y colores.
*/ */
private static PauseTransition createPauseTransition(Rectangle rectangle, Color colorBackground) { private static PauseTransition createPauseTransition(Rectangle rectangle, Color colorBackground) {
PauseTransition changeColor = new PauseTransition(new Duration(DURACION)); PauseTransition changeColor = new PauseTransition(new Duration(DURACION));
changeColor.setOnFinished(actionEvent -> rectangle.setFill(colorBackground)); changeColor.setOnFinished(actionEvent -> rectangle.setFill(colorBackground));
return changeColor; return changeColor;
} }
/** /**
* Crear un animacion de transicion usando colores que cambian. * Crear un animacion de transicion usando colores que cambian.
* *
* @param circle Circle: El objeto que desea animar. * @param circle Circle: El objeto que desea animar.
* @param colorBackground Color: Color del fondo de destacar. * @param colorBackground Color: Color del fondo de destacar.
* *
* @return PauseTransition: La transition creado con los elementos y colores. * @return PauseTransition: La transition creado con los elementos y colores.
*/ */
private static PauseTransition createPauseTransition(Circle circle, Color colorBackground) { private static PauseTransition createPauseTransition(Circle circle, Color colorBackground) {
PauseTransition changeColor = new PauseTransition(new Duration(DURACION)); PauseTransition changeColor = new PauseTransition(new Duration(DURACION));
changeColor.setOnFinished(actionEvent -> circle.setFill(colorBackground)); changeColor.setOnFinished(actionEvent -> circle.setFill(colorBackground));
return changeColor; return changeColor;
} }
/** /**
* Crear un animacion de transicion usando colores que cambian. * Crear un animacion de transicion usando colores que cambian.
* *
* @param text Text: El texto que desea animar. * @param text Text: El texto que desea animar.
* @param colorText Color: Color del texto. * @param colorText Color: Color del texto.
* *
* @return PauseTransition: La transition creado con los elementos y colores. * @return PauseTransition: La transition creado con los elementos y colores.
*/ */
private static PauseTransition createPauseTransition(Text text, Color colorText) { private static PauseTransition createPauseTransition(Text text, Color colorText) {
PauseTransition changeColor = new PauseTransition(new Duration(DURACION)); PauseTransition changeColor = new PauseTransition(new Duration(DURACION));
changeColor.setOnFinished(actionEvent -> text.setStroke(colorText)); changeColor.setOnFinished(actionEvent -> text.setStroke(colorText));
return changeColor; return changeColor;
} }
/** /**
* Remover todos los elementos destacados. * Remover todos los elementos destacados.
*/ */
public void removerDestacar() { public void removerDestacar() {
if (destacados.size() != 0) { if (destacados.size() != 0) {
for (int i = 0; i < destacados.size(); i++) { int size = destacados.size();
destacados.get(i).getSequentialTransition().stop(); for (int i = 0; i < size; i++) {
destacados.get(0).getSequentialTransition().stop();
if (destacados.get(i).getTipo() == RECTANGULO) { if (destacados.get(0).getTipo() == RECTANGULO) {
Rectangle rectangle = (Rectangle) scene.lookup(destacados.get(i).getId()); Rectangle rectangle = (Rectangle) scene.lookup(destacados.get(0).getId());
rectangle.setFill(destacados.get(i).getColor()); rectangle.setFill(destacados.get(0).getColor());
} }
else if (destacados.get(i).getTipo() == CIRCULO) { else if (destacados.get(0).getTipo() == CIRCULO) {
Circle circle = (Circle) scene.lookup(destacados.get(i).getId()); Circle circle = (Circle) scene.lookup(destacados.get(0).getId());
circle.setFill(destacados.get(i).getColor()); circle.setFill(destacados.get(0).getColor());
} }
else { else {
Text text = (Text) scene.lookup(destacados.get(i).getId()); Text text = (Text) scene.lookup(destacados.get(0).getId());
text.setStroke(destacados.get(i).getColor()); text.setStroke(destacados.get(0).getColor());
} }
destacados.remove(i); destacados.remove(0);
} }
} }
} }
/** /**
* Clase de elemento destacado. * Clase de elemento destacado.
* *
* @author Chris Cromer * @author Chris Cromer
*/ */
final static private class Destacados { final static private class Destacados {
/** /**
* El tipo de objeto que está destacado. * El tipo de objeto que está destacado.
*/ */
final private int tipo; final private int tipo;
/** /**
* El id del elemento destacado. * El id del elemento destacado.
*/ */
final private String id; final private String id;
/** /**
* El color anterior del elemento destacado. * El color anterior del elemento destacado.
*/ */
final private Color color; final private Color color;
/** /**
* La animación del elemento destacado. * La animación del elemento destacado.
*/ */
final private SequentialTransition sequentialTransition; final private SequentialTransition sequentialTransition;
/** /**
* Inicilizar. * Inicilizar.
* @param tipo int: El tipo de elemento destacado, {@value #RECTANGULO}, {@value #CIRCULO} o {@value #TEXTO}. * @param tipo int: El tipo de elemento destacado, {@value #RECTANGULO}, {@value #CIRCULO} o {@value #TEXTO}.
* @param id String: El id para identificar el elemento. * @param id String: El id para identificar el elemento.
* @param color Color: El color anterior para cambiarlo cuando {@link #removerDestacar()} es usado. * @param color Color: El color anterior para cambiarlo cuando {@link #removerDestacar()} es usado.
* @param sequentialTransition SequentialTransition: La animación a usar. * @param sequentialTransition SequentialTransition: La animación a usar.
*/ */
public Destacados(int tipo, String id, Color color, SequentialTransition sequentialTransition) { public Destacados(int tipo, String id, Color color, SequentialTransition sequentialTransition) {
this.tipo = tipo; this.tipo = tipo;
this.id = id; this.id = id;
this.color = color; this.color = color;
this.sequentialTransition = sequentialTransition; this.sequentialTransition = sequentialTransition;
} }
/** /**
* Devolver el tipo de elemento destacado. * Devolver el tipo de elemento destacado.
* @return int: El tipo destacado. * @return int: El tipo destacado.
*/ */
public int getTipo() { public int getTipo() {
return tipo; return tipo;
} }
/** /**
* Devolver el ID de elemento destacado. * Devolver el ID de elemento destacado.
* @return String: El ID destacado. * @return String: El ID destacado.
*/ */
public String getId() { public String getId() {
return id; return id;
} }
/** /**
* Devolver el color anterior antes que fue destacado. * Devolver el color anterior antes que fue destacado.
* @return Color: El color anterior. *
*/ * @return Color: El color anterior.
public Color getColor() { */
return color; public Color getColor() {
} return color;
}
/** /**
* Devolver la animación que es en uso con el elemento. * Devolver la animación que es en uso con el elemento.
* @return SequentialTransition: La animación. * @return SequentialTransition: La animación.
*/ */
public SequentialTransition getSequentialTransition() { public SequentialTransition getSequentialTransition() {
return sequentialTransition; return sequentialTransition;
} }
} }
} }

View File

@ -1,30 +1,68 @@
package cl.cromer.estructuras; package cl.cromer.estructuras;
/**
* La estructura de un elemento de una Tabla Hash.
*/
public class HashItem { public class HashItem {
final private String llave; /**
* La llave.
*/
final private String llave;
final private int valor; /**
* El valor.
*/
final private int valor;
private int indice; /**
* Donde el elemento está en el array.
*/
private int indice;
public HashItem(String llave, int valor) { /**
this.llave = llave; * Inicilizar.
this.valor = valor; *
} * @param llave String: La llave del elemento.
* @param valor int: El valor del elemento.
*/
public HashItem(String llave, int valor) {
this.llave = llave;
this.valor = valor;
}
public String getLlave() { /**
return llave; * Devolver la llave del elemento.
} *
* @return String: La llave.
*/
public String getLlave() {
return llave;
}
public int getValor() { /**
return valor; * Devolver el valor del elemento.
} *
* @return int: El valor.
*/
public int getValor() {
return valor;
}
public int getIndice() { /**
return indice; * Devolver el indice del elemento.
} *
* @return int: El indice.
*/
public int getIndice() {
return indice;
}
public void setIndice(int indice) { /**
this.indice = indice; * Cambiar el indice.
} *
* @param indice int: El indice.
*/
public void setIndice(int indice) {
this.indice = indice;
}
} }

View File

@ -1,23 +1,50 @@
package cl.cromer.estructuras; package cl.cromer.estructuras;
/**
* Esta clase es tipo de estructura de dato Tabla Hash.
*
* @author Chris Cromer
*/
public class HashTable { public class HashTable {
final private HashItem hashArray[]; /**
* El array donde están todos los elementos de la tabla hash.
*/
final private HashItem hashArray[];
final private int tamano; /**
private int size; * El tamaño maximo de la tabla hash.
*/
final private int tamano;
public HashTable(int tamano) { /**
* Cantidad de elementos que están en la tabla hash.
*/
private int size;
/**
* Inicilizar.
*
* @param tamano int: El tamaño maximo de la tabla hash.
*/
public HashTable(int tamano) {
this.tamano = tamano; this.tamano = tamano;
hashArray = new HashItem[tamano]; hashArray = new HashItem[tamano];
} }
public int size() { /**
* Devolver la cantidad de elementos que están en la tabla.
*
* @return int: La cantidad.
*/
public int size() {
return size; return size;
} }
/** /**
* Este metodo crea un hash muy único. * Este metodo crea un hash muy único.
*
* @param string String: El string a hashear. * @param string String: El string a hashear.
*
* @return int: El hash a devolver. * @return int: El hash a devolver.
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -43,7 +70,15 @@ public class HashTable {
return (Math.abs(sum) % tamano); return (Math.abs(sum) % tamano);
} }
public boolean insertar(String llave, int valor) { /**
* Insertar una llave y valor en la tabla hash.
*
* @param llave String: La llave para identificar un elemento.
* @param valor int: El valor a insertar.
*
* @return boolean: Verdad si fue insertado, sino está llena la tabla hash.
*/
public boolean insertar(String llave, int valor) {
HashItem hashItem = new HashItem(llave, valor); HashItem hashItem = new HashItem(llave, valor);
int hashIndice = hash(hashItem.getLlave()); int hashIndice = hash(hashItem.getLlave());
int i = 0; int i = 0;
@ -84,14 +119,22 @@ public class HashTable {
return hash % tamano; return hash % tamano;
} }
public boolean eliminar(String llave) { /**
* Eliminar un elemento de la tabla hash.
*
* @param llave String: La llave a elminar.
*
* @return boolean: Verdad si fue borrado, sino no existiá.
*/
public boolean eliminar(String llave) {
HashItem hashItem = new HashItem(llave, 0); HashItem hashItem = new HashItem(llave, 0);
int hashIndice = hash(hashItem.getLlave()); int hashIndice = hash(hashItem.getLlave());
int i = 0; int i = 0;
while (hashArray[hashIndice] != null && hashArray[hashIndice].getLlave() != null && i < tamano) { while (hashArray[hashIndice] != null && hashArray[hashIndice].getLlave() != null && i < tamano) {
if (hashArray[hashIndice].getLlave().equals(llave)) { if (hashArray[hashIndice].getLlave().equals(llave)) {
hashArray[hashIndice] = null; hashArray[hashIndice] = null;
return true; size--;
return true;
} }
hashIndice++; hashIndice++;
hashIndice = hashIndice % tamano; hashIndice = hashIndice % tamano;
@ -100,7 +143,14 @@ public class HashTable {
return false; return false;
} }
public HashItem buscar(String llave) { /**
* Buscar una llave en la tabla hash.
*
* @param llave String: La llave a buscar.
*
* @return HashItem: Devolver el elemento que contine la llave.
*/
public HashItem buscar(String llave) {
for (int i = 0; i < tamano; i++) { for (int i = 0; i < tamano; i++) {
if (hashArray[i] != null && hashArray[i].getLlave().equals(llave)) { if (hashArray[i] != null && hashArray[i].getLlave().equals(llave)) {
return hashArray[i]; return hashArray[i];
@ -113,6 +163,7 @@ public class HashTable {
* Devolver el valor que está guardado en cada indice. Se usa para construir la grafica. * Devolver el valor que está guardado en cada indice. Se usa para construir la grafica.
* *
* @param indice int: El indice que desea ver. * @param indice int: El indice que desea ver.
*
* @return String: El valor que está en dicho indice. * @return String: El valor que está en dicho indice.
*/ */
public HashItem getIndice(int indice) { public HashItem getIndice(int indice) {