ORDENAMIENTO Y BUSQUEDA
En arreglos de objetos
Ahora vamos a
adecuar los algoritmos de ordenamiento vistos en la clase anterior para ordenar
colecciones de objetos. Para ello, considere la clase Producto con los
siguientes atributos: código(cadena), descripción(cadena), precio(real). Diseñe
la clase ColeccionProductos que tenga como atributo un objeto de la
clase ArrayList y considere los siguientes métodos de administración: adiciona(),
obtiene(), tamaño(), actualiza(). Finalmente diseñe la
clase ColeccionProductosEnOrden que herede a la clase ColeccionProductos
y agregue los siguientes métodos de ordenamiento: burbujaOptimizada(),
inserción(), selección().
El método burbuja optimizada tendría
el siguiente código para ordenar por código:
Producto temp;
for
(int i=0 ; i<tamaño() - 1; i++)
for
(int j=i+1; j<tamaño(); j++)
if (obtiene(i).getCodigo().compareTo(
obtiene(j).getCodigo()>0)
){
temp = new
Producto(obtiene(i).getCodigo(),
obtiene(i).getDescripcion(),
obtiene(i).getPrecio());
actualiza(i,obtiene(j));
actualiza(j,temp);
}
El método inserción tendría el
siguiente código para ordenar por descripcion:
int i, j;
Producto
temp;
for
(i = 1; i < tamaño(); i++){
temp = new Producto(obtiene(i).getCodigo(),
obtiene(i).getDescripcion(),
obtiene(i).getPrecio());
j = i - 1;
while ( (j >= 0&& obtiene(j).getDescripcion().compareTo(
temp.getDescripcion() > 0) ){
actualiza(j + 1,obtiene(j));
j--;
}
actualiza(j + 1,temp);
}
BUSQUEDA:
Puede
aplicar su método de búsqueda secuencial.
int busquedaSecuencial( int
key ){
for(int i=0, i<n, i++){
if(obtiene(i).getDato()==key)
return i;
}
return -1;
}
Sin embargo, cuando el vector está
ordenado, el método de búsqueda puede mejorar en tiempo, de la siguiente
manera:
int
busquedaSecuencial( int key){
int
i = 0;
while(i<n
&& obtiene(i).getDato()<key){
i++;
}
if(i<n
&& obtiene(i).getDato()==key)
return i;
else
return-1;
}
También se puede aplicar la búsqueda binaria cuando se
tiene un vector ordenado, de la siguiente manera:
int
busquedaBinaria (int key ){
int inicio = 0 ;
int fin =n-1;
while( inicio <= fin ){
int mitad <-(inicio + fin) / 2;
if(
obtiene(mitad).getDato() < key )
inicio = mitad + 1;
else
if(obtiene(mitad).getDato()
> key )
fin = mitad –1;
else
return mitad;
}
return -1;
}
Adecúe los métodos de búsqueda presentados para que sean
utilizados con el arreglo de objetos de Productos. Elija el código de producto
como clave de búsqueda.
Ejercicio 1:
Cree
un proyecto de nombre P03E01, un paquete de nombre p03e01 y diseñe la clase
Producto con los siguientes atributos: código(cadena), descripción(cadena),
precio(real). Luego diseñe la clase ColeccionProductos con los siguientes
atributos:
Objeto
de tipo ArrayList particularizada para la clase <Producto> con sus
métodos de administración: adiciona(), obtiene(), tamaño(), actualiza().
Luego
diseñe la clase ColeccionProductosEnOrden que hereda a la clase
ColeccionProductos y agrega los siguientes métodos:
ordenBurbujaOptimizada(),
ordena el arreglo de productos por código mediante el método burbuja Optimizada
ordenInsersion(),
ordena el arreglo de productos por código mediante el método de inserción
ordenSeleccion(),
ordena el arreglo de productos por código mediante el método de selección
contenido(),
retorna en un string el contenido del arreglo de productos en forma tabulada.
Diseñe
la clase PanelPrincipal con 5 botones y programe cada uno de ellos invocando al
contenido para verificar el proceso.
Diseñe
la clase Principal de tipo Frame donde coloca el panel anterior y hace
funcionar su programa.
Solución:
package p03e01;
public class Producto {
// atributos
private String Codigo;
private String Descripcion;
private double Precio;
// constructor
public Producto(String Codigo,String
Descripcion, double Precio){
this.Codigo=Codigo;
this.Descripcion= Descripcion;
this.Precio=Precio;
}
// metodos get
- set
public String getCodigo() {
return Codigo;
}
public void setCodigo(String Codigo) {
this.Codigo = Codigo;
}
public String getDescripcion() {
return Descripcion;
}
public void setDescripcion(String
Descripcion) {
this.Descripcion= Descripcion; }
public double getPrecio() {
return Precio;
}
public void setPrecio(double Precio) {
this.Precio
= Precio;
}
} // Fin de la clase Producto.
package
p03e01;
import
java.util.ArrayList;
public class ColeccionProductos {
private ArrayList <Producto> a; //
particulariza a objetos de tipo producto
public ColeccionProductos(){
a = new ArrayList <Producto> ();
}
//metodos de administracion
public int Tamaño() {
return a.size();
}
public void agrega (Producto p){
a.add(p);
}
public Producto getProducto(int i){
return a.get(i);
}
public void actualiza(Producto p, int i){ //
actualize un objeto
a.set(i, p);
}
public void elimina(int p){
a.remove(p);
}
public int busca(String codigo){
for(int i=0; i<Tamaño(); i++){
if(getProducto(i).getCodigo().equals(codigo))
return
i;
}
return -1;
}
} // Fin de la clase ColecciónProductos
package p03e01;
public class ColeccionProductosEnOrden
extends ColeccionProductos {
public void
burbujaOptimizada(){
Producto temp;
for (int i=0 ; i<Tamaño() - 1; i++){
for (int j=i+1; j<Tamaño();
j++){
if
(getProducto(i).getCodigo().compareTo(getProducto(j).getCodigo())>0){
temp = new
Producto(getProducto(i).getCodigo(),
getProducto(i).getDescripcion(),
getProducto(i).getPrecio());
actualiza(getProducto(j),i);
actualiza(temp,j);
} }
}
}
public void Insersion(){
int i, j;
Producto temp;
for (i = 1; i < Tamaño(); i++){
temp = new Producto(getProducto(i).getCodigo(),getProducto(i).getDescripcion(),getProducto(i).getPrecio());
j = i - 1;
while (j >= 0&&
getProducto(j).getDescripcion().compareTo(temp.getDescripcion())>0) {
actualiza(getProducto(j),j+1);
j--;
}
actualiza(temp,j+1);
}
}
public void Seleccion(){
int i,j, p,
limit=Tamaño()-1;
Producto temp;
for(j=0; j<limit; j++){
p=j;
for(i=j+1; i<=limit; i++){
if(getProducto(i).getPrecio()< getProducto(p).getPrecio()) p=i;
if(p!=j){
temp= new
Producto(getProducto(p).getCodigo(),
getProducto(p).getDescripcion(),
getProducto(p).getPrecio());
actualiza(getProducto(j),p);
actualiza(temp,j);
} }
}
}
public void
SeleccionDes(){
int i,j, p, limit=Tamaño()-1;
Producto temp;
for(j=0; j<limit; j++){
p=j;
for(i=j+1; i<=limit; i++){
if(getProducto(i).getPrecio()> getProducto(p).getPrecio()) p=i;
if(p!=j){
temp= new Producto(getProducto(p).getCodigo(),
getProducto(p).getDescripcion(),
getProducto(p).getPrecio());
actualiza(getProducto(j),p);
actualiza(temp,j);
} }
}
}
public
String contenido(int i){
String info;
info=getProducto(i).getCodigo()+"\t";
info+=getProducto(i).getDescripcion()+"\t";
info+=getProducto(i).getPrecio();
return info;
}
} // Fin de la Clase ColeccionProductosEnOrden
Ahora creamos el PanelPrincipal
Ahora
la Codificación dentro del PanelPrincipal.
package
p03e01;
import
javax.swing.JOptionPane;
public class
PanelPrincipal extends javax.swing.JPanel {
private ColeccionProductosEnOrden cp;
public PanelPrincipal() {
initComponents();
setSize(650,450);
cp = new ColeccionProductosEnOrden();
}
int p = cp.busca(leeCodigo());
if(p!=-1)
mensaje("Error:
El número ingresado ya existe");
else{
Producto nuevo= new
Producto(leeCodigo(),leeDescripcion(),leePrecio());
cp.agrega(nuevo);
lista(); }
txtCodigo.setText("");
txtDescripcion.setText("");
txtPrecio.setText("");
}
public String leeCodigo(){
return txtCodigo.getText();
}
public String leeDescripcion(){
return txtDescripcion.getText();
}
public double leePrecio(){
return
Double.parseDouble(txtPrecio.getText());
}
public void lista(Producto p){
imprime("Codigo\t:"+p.getCodigo());
imprime("Descripcion\t:"+p.getDescripcion());
imprime("Precio\t:"+p.getPrecio());
txtDescripcion.setText(p.getDescripcion());
txtPrecio.setText(p.getPrecio()+"");
}
public void lista(){
txtSalida.setText("codigo\tDescripcion\tPrecio\n");
for(int i=0;
i<cp.Tamaño(); i++){
Producto p=cp.getProducto(i);
imprime(cp.contenido(i));
}
}
public void imprime(String s){
txtSalida.append(s+"\n");
}
public void mensaje(String s){
JOptionPane.showMessageDialog(this, s);
}
private void
btnBurbujaOptActionPerformed(java.awt.event.ActionEvent evt) {
cp.burbujaOptimizada();
lista();
}
private void
btnInsersionActionPerformed(java.awt.event.ActionEvent evt) {
cp.Insersion();
lista();
}
private
void btnSeleccionActionPerformed(java.awt.event.ActionEvent evt) {
cp.Seleccion();
lista();
}
private void
btnListaActionPerformed(java.awt.event.ActionEvent evt) {
lista();
}
private void
txtPrecioActionPerformed(java.awt.event.ActionEvent evt) {
}
private void
btnBorrarActionPerformed(java.awt.event.ActionEvent evt) {
txtSalida.setText("");
txtCodigo.setText("");
txtDescripcion.setText("");
txtPrecio.setText("");
txtCodigo.requestFocus();
}
private void
btnSeleccionDesActionPerformed(java.awt.event.ActionEvent evt) {
cp.SeleccionDes();
lista();
}
private
javax.swing.JButton btnBorrar;
private javax.swing.JButton btnBurbujaOpt;
private javax.swing.JButton
btnInsersion;
private javax.swing.JButton
btnLista;
private javax.swing.JButton
btnNuevo;
private javax.swing.JButton
btnSeleccion;
private javax.swing.JButton
btnSeleccionDes;
private javax.swing.JPanel
jPanel1;
private javax.swing.JPanel
jPanel2;
private
javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel
jbl;
private javax.swing.JLabel
jbl1;
private javax.swing.JLabel
jbl2;
private javax.swing.JTextField
txtCodigo;
private javax.swing.JTextField
txtDescripcion;
private javax.swing.JTextField
txtPrecio;
private javax.swing.JTextArea
txtSalida;
}
// Ejecute el programa.
0 comentarios:
Publicar un comentario