Conviértete en un emprendedor,profesional del conocimiento en la programación

lunes, 9 de enero de 2012

ORDENAMIENTO Y BUSQUEDA EN ARREGLOS DE OBJETOS

Compartir con:


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