Foros del Web » Programación para mayores de 30 ;) » Java »

Optimizar código

Estas en el tema de Optimizar código en el foro de Java en Foros del Web. He creado un programa que dentro de un array de números, revisa si son números pares, de ser pares crea un array con los pares ...
  #1 (permalink)  
Antiguo 28/01/2014, 03:11
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Pregunta Optimizar código

He creado un programa que dentro de un array de números, revisa si son números pares, de ser pares crea un array con los pares y el anterior lo deja con los impares y donde había pares aparecen "0". Pero me piden que lo optimice porque tiene demasiados bucles, pero no se como hacerlo sin estropear el programa.

Este es el código:

Código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clasearray;

import java.util.Scanner;
import java.util.*;

/**
 *
 * @author mati
 */
public class ClaseArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
    

Scanner teclado=new Scanner(System.in);
//variables
int opcion;
int [] v1;
v1 = new int[6];



/*-------------------------------------------------------------------------*/ 
do{

System.out.println("Introduce una opción del menu.");
verMenu();
opcion=teclado.nextInt();


switch(opcion){

case 1: 
leerArray(v1); 
break;

case 2: 
escribeArray(v1);
break;

case 3: quitarPares(v1); 
break;
    
case 4: ; 
break;
    
default: System.out.println("Error" ); break;

}
}while(opcion!=4);


}

/*-------------------------------------------------------------------------*/ 

public static void verMenu(){
    System.out.println("1. Introducir el vector");
    System.out.println("2. Escribirir el vector");
    System.out.println("3. Eliminar los pares");
    System.out.println("4. Finalizar"); 
}

// método introduce valores a un vector
public static void leerArray(int [] v){
    Scanner teclado=new Scanner (System.in);


    for(int i=0;i<v.length;i++){
    System.out.println("Introduce un valor para la posición "+i+" de "+(v.length-1));
    v[i]=teclado.nextInt();
    }

}

// método muestra vector
public static void escribeArray( int [] array){
    
    System.out.println("");
        System.out.print("{");
        for(int i=0;i<array.length;i++){
            System.out.print("["+array[i]+"]");
            if(i!=array.length-1) System.out.print(",");
        }
        System.out.println("}");
        System.out.println("");
    }


public static void quitarPares(int [] v){
        int rest, cont=0, cont2=0;

    for(int i=0;i<v.length;i++){
        int div=(int)v[i];
        
        rest=div%2;
        
        if(rest==1){
            cont+=1;
        }
    }
    
    for(int i=0;i<v.length;i++){
        int div=(int)v[i];
        
        rest=div%2;
        
        if(rest==0){
            cont2+=1;
        }
    }
        
    //nuevo vector para los pares
    int [] vimPar;
    vimPar = new int[(int)v.length];
    
    //Introducir valores al nuevo vector
    int j=0;
    for(int i=0;i<v.length;i++){
        
            if(v[i]%2==1){
                vimPar[j]=v[i];
                j++;
                int pos=j;
            }
        
    }
    
    //muestra vector original
        System.out.println("Muestra vector original.");
    escribeArray(v);
    
        System.out.println("");
        
    //muestra nuevo vector  
        System.out.println("Muestra vector impar.");
    escribeArray(vimPar);
    
        System.out.println("");
        
        //-------------------------------------
        
        
        
    //nuevo vector para los pares
    int [] vPar;
    vPar = new int[cont2];
    
    //Introducir valores al nuevo vector
    int p=0;
    for(int i=0;i<v.length;i++){
        
            if(v[i]%2==0){
                vPar[p]=v[i];
                p++;
            }
        
    }
    
    //muestra vector Par
        System.out.println("Muestra vector Par.");
    escribeArray(vPar);
    
        System.out.println("");

}

}
  #2 (permalink)  
Antiguo 28/01/2014, 03:32
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Optimizar código

Una optimización muy sencilla es eliminar un bucle for.

Si las matemáticas no han cambiado un número es par O impar. No puede ser ambas cosas ni ninguna de ellas, es decir, que es una condición o es la otra.

Entonces, partiendo de esa premisa, al comprobar si un numero es par: si cumple la condición es par y si no la cumple es impar. Al revés si la comprovación que haces es para ver si es impar: si cumple la condición es impar, sino es par.

Así de entrada es lo primero que veo. La idea para optmizar el código es intentar agrupar todo el trabajo que puedas al recorrer el vector, en lugar de recorrerlo varias veces para hacer pequeñas tareas.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 28/01/2014, 04:33
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Optimizar código

Gracias, por lo menos ahora hay un "for" menos, de este modo el código se ha quedado de este modo:

Código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classarray;

import java.util.Scanner;

/**
 *
 * @author Joan
 */
public class ClassArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner teclado=new Scanner(System.in);
//variables
int opcion;
int [] v1;
v1 = new int[6];



/*-------------------------------------------------------------------------*/ 
do{

System.out.println("Introduce una opción del menu.");
verMenu();
opcion=teclado.nextInt();


switch(opcion){

case 1: 
leerArray(v1); 
break;

case 2: 
escribeArray(v1);
break;

case 3: quitarPares(v1); 
break;
    
case 4: ; 
break;
    
default: System.out.println("Error" ); break;

}
}while(opcion!=4);


}

/*-------------------------------------------------------------------------*/ 

public static void verMenu(){
    System.out.println("1. Introducir el vector");
    System.out.println("2. Escribirir el vector");
    System.out.println("3. Eliminar los pares");
    System.out.println("4. Finalizar"); 
}

// método introduce valores a un vector
public static void leerArray(int [] v){
    Scanner teclado=new Scanner (System.in);


    for(int i=0;i<v.length;i++){
    System.out.println("Introduce un valor para la posición "+i+" de "+(v.length-1));
    v[i]=teclado.nextInt();
    }

}

// método muestra vector
public static void escribeArray( int [] array){
    
    System.out.println("");
        System.out.print("{");
        for(int i=0;i<array.length;i++){
            System.out.print("["+array[i]+"]");
            if(i!=array.length-1) System.out.print(",");
        }
        System.out.println("}");
        System.out.println("");
    }


public static void quitarPares(int [] v){
        int rest, cont=0, cont2=0;

    for(int i=0;i<v.length;i++){
        int div=(int)v[i];
        
        rest=div%2;
        
        if(rest==1){
            cont+=1;
        }else{
            cont2+=1;
        }
    }
        
    //nuevo vector para los impares
    int [] vimPar;
    vimPar = new int[(int)v.length];
    
    //Introducir valores al nuevo vector
    int j=0;
    for(int i=0;i<v.length;i++){
        
            if(v[i]%2==1){
                vimPar[j]=v[i];
                j++;
                int pos=j;
            }
        
    }
    
    //muestra vector original
        System.out.println("Muestra vector original.");
    escribeArray(v);
    
        System.out.println("");
        
    //muestra nuevo vector  
        System.out.println("Muestra vector impar.");
    escribeArray(vimPar);
    
        System.out.println("");
        
        //-------------------------------------
        
        
        
    //nuevo vector para los pares
    int [] vPar;
    vPar = new int[cont2];
    
    //Introducir valores al nuevo vector
    int p=0;
    for(int i=0;i<v.length;i++){
        
            if(v[i]%2==0){
                vPar[p]=v[i];
                p++;
            }
        
    }
    
    //muestra vector Par
        System.out.println("Muestra vector Par.");
    escribeArray(vPar);
    
        System.out.println("");

}

}
  #4 (permalink)  
Antiguo 28/01/2014, 04:40
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Optimizar código

En realidad, de las opciones del menú solo puedes optimizar la 3. Yo te he comentado como empezar a hacerlo pero si revisas en pseudocódigo lo que haces en esa función, puedes reestructurarlo y dejarlo para que use únicamente un bucle for.
__________________
Aviso: No se resuelven dudas por MP!

Etiquetas: clase, programa, string, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:45.