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

Mover elementos en un arreglo, problemas

Estas en el tema de Mover elementos en un arreglo, problemas en el foro de Java en Foros del Web. Hola, Estoy creando una classe que simula un banco. La clase hace las tareas típicas del banco. ingresar dinero, sacar dinero y mostrar el saldo. ...
  #1 (permalink)  
Antiguo 29/09/2011, 11:17
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 21 años, 5 meses
Puntos: 2
Mover elementos en un arreglo, problemas

Hola,

Estoy creando una classe que simula un banco. La clase hace las tareas típicas del banco. ingresar dinero, sacar dinero y mostrar el saldo.
El problema de la clase esta en que las ultimas 10 transacciones se deben guardar en un arreglo, si el usuario realiza una transacción mas , cada transacción en el arreglo deben moverse para dejar un lugar libre en el arreglo así la ultima transacción se pueda guardar en el arreglo.

Hasta ahora todo funciona, puedo realizar 10 transacciones, guardarlas en el arreglo y mostrarlas después. El problema esta en que cuando hago una transacción mas, ésta no se guarda en el arreglo, si no que la transacción que esta en el ultimo lugar del arreglo se copia a la posición 0 del arreglo.

Este es el codigo que he escrito:

Código:
public class Bank {

    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);

        int amount = 0, choice = 0, sum = 0, balance = 0;
        int[] trans = new int[10];

        //mientras el usuario no decide terminar ingresa al switch

        while (choice != 4) {
            choice = menu();
            switch (choice) {
                case 1:
                    System.out.print("Ingresar dinero: ");
                    sum = input.nextInt();
                    amount = (int) +sum;
                    makeTransactions(amount, trans);
                    break;

                case 2:
                    System.out.print("Sacar dinero: ");
                    sum = input.nextInt();
                    amount = (int) -sum;
                    makeTransactions(amount, trans);
                    break;

                case 3:
                    showTransactions(trans, balance);
                    break;

                default:
                    System.out.println("Terminar");
                    break;
            }
        }
    }

    // Muestra el menu y recive la opcion del usuario
    
    public static int menu() {
        int choice = 0;

        Scanner input = new Scanner(System.in);
        System.out.println("Banco");
        System.out.println("-------------------");
        System.out.println();
        System.out.println("1. Ingresar dinero");
        System.out.println("2. Scar dinero");
        System.out.println("3. Saldo");
        System.out.println("4. Terminar");
        System.out.println();
        System.out.print("Tu opcion: ");

        choice = input.nextInt();

        return choice;
    }

    
    //Muestra las ultimas 10 transacciones mas el saldo
    
    public static void showTransactions(int[] trans, int balance) {
        System.out.println();
        System.out.println("Historial: ");
        System.out.println();

        for (int i = 0; i < trans.length; i++) {
            if (trans[i] == 0) {
                System.out.print("");
            } else {
                System.out.print(trans[i] + "\n");
                balance += trans[i];
            }
        }

        System.out.println();
        System.out.println("Saldo: " + balance);
        System.out.println();
    }
    
    //Coloca la ultima transaccion en el ultimo lugar libre del array
    // si el array esta lleno, moveTrans creara un espacio libre en el array
    
    public static void makeTransactions(int amount, int[] trans) {
        int position = findNr(trans);
        if (position == -1) {
            moveTrans(trans);
        } else {
            trans[position] = amount;
        }
    }

    
    // Entrega la posicion en el array en donde la transaccion se guardara
    // si no hay lugares devuelve -1
    
    public static int findNr(int[] trans) {
        
        int position = - 1;

        for (int i = 0; i < trans.length; i++) {
            if (trans[i] == 0) {
                position = i;
                break;
            }
        }

        return position;
    }

    //Mueve todas las transacciones en el array un lugar para hacer espacio
    //para la nueva transaccion. La transaccion mas antigua se sobreescribe.
    
    public static void moveTrans(int[] trans) {
        for (int i = 0; i < trans.length - 1; i++) {
            trans[0] = trans[i + 1];
        }
    }
     
}
En este codigo el arreglo tiene 4 posiciones para probarlo mas rápido. Al ejecutarlo y seleccionando ingresar dinero las 4 veces obtengo esto:

Código PHP:
Historial

1
2
3
4

Saldo
10 
Cuando continuo e ingreso 5 (o un quinto elemento) el resultado es:

Código PHP:
Historial

4  <==== aqui se repite la ultima transacción
2
3
4

Saldo
10 
Lo ideal es sue sea:

Código PHP:
Historial

2
3
<==== las transacciones anteriores se mueven un lugar
<==== ultima transaccion

Saldo
14 <=== el saldo se actualiza 
Me magino que el problema debe estar en el metodo moveTrans() pero no logro entender donde esta el error.

Me podrían ayudar a resolver esto? Gracias a todos.
  #2 (permalink)  
Antiguo 30/09/2011, 02:50
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Mover elementos en un arreglo, problemas

Hombre, si le dices que siempre te guarde en trans[0], es normal.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 30/09/2011, 04:56
 
Fecha de Ingreso: mayo-2011
Mensajes: 79
Antigüedad: 12 años, 10 meses
Puntos: 14
Respuesta: Mover elementos en un arreglo, problemas

Como dice Xerelo, el método moveTrasns cojea un poco al guardar siempre en la posición cero
__________________
Web Admin:
http://www.coretec.es
Tutoriales, Noticias y Recursos Liferay y J2EE
  #4 (permalink)  
Antiguo 30/09/2011, 08:25
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 21 años, 5 meses
Puntos: 2
Respuesta: Mover elementos en un arreglo, problemas

Ok, pero si hago esto (tomando en cuenta que el arreglo tiene 4 lugares):

Código PHP:
public static void moveTrans(int[] trans) {
        for (
int i 0trans.length 1i++) {
            
trans[3] = trans[1]; <=== trans[3el ultimo lugar del arreglo
        
}
    } 
al ingresar los primeros 4 valores (1, 2, 3, 4) funciona correctamente.

Código PHP:
1  


4  

Saldo
10 
Pero al ingresar un valor mas (5), quedo con esto:

Código PHP:
1  


3  
<==== que pasa aqui??

Saldo
  #5 (permalink)  
Antiguo 30/09/2011, 08:57
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Mover elementos en un arreglo, problemas

O sea que entiendes como funciona un bucle para leer de distintas posiciones, pero no entiendes como funciona un bucle para guardar en distintas posiciones.

Pues es lo mismo, reflexiona un poco.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 30/09/2011, 10:54
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Mover elementos en un arreglo, problemas

El problema es evidente y es que no estás realizando correctamente el desplazamiento de los elementos.

Si lo que quieres es mover cada posición del array a la anterior, no vale con:

Código Java:
Ver original
  1. public static void moveTrans(int[] trans) {
  2.         for (int i = 0; i < trans.length - 1; i++) {
  3.             trans[3] = trans[i + 1]; <=== trans[3] el ultimo lugar del arreglo
  4.         }
  5.     }

Si te fijas, te darás cuenta de que lo único que estás haciendo es copiar el elemento 0 del array a la última posición, luego el elemento 1 a la última posición de nuevo y así hasta la última iteración en la que copias la última posición en sí misma.

No estás moviendo los elementos a la izquierda para dejar espacio a un elemento.

Creo además que deberías cambiar la forma en la que resuelves la inserción de un elemento cuando no cabe porque no está bien.

Código Java:
Ver original
  1. public static void makeTransactions(int amount, int[] trans) {
  2.         int position = findNr(trans);
  3.         if (position == -1) {
  4.             moveTrans(trans);
  5.         } else {
  6.             trans[position] = amount;
  7.         }
  8.     }

Cuando el método findNr devuelve -1, llamas a moveTrans, pero luego no le asignas el valor de amount en la última posición.

Lo correcto (o, por lo menos funciona):

Código Java:
Ver original
  1. public static void makeTransactions(int amount, int[] trans) {
  2.  
  3.  
  4.         int position = findNr(trans);
  5.         if (position == -1) {
  6.             moveTrans(trans);
  7.             position = trans.length -1
  8.         }
  9.         trans[position] = amount;
  10.        
  11.     }

Y, por supuesto, arreglar el método moveTrans.
  #7 (permalink)  
Antiguo 30/09/2011, 11:48
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 21 años, 5 meses
Puntos: 2
Respuesta: Mover elementos en un arreglo, problemas

Gracias a todos, después de recorrer la clase manualmente un montón de veces encontré la solución

en el metodo makeTransactions, como dice alexg88, no estaba enviando nada al nuevo lugar en el arreglo, así que lo he modificado y he dejado así:


Código PHP:
public static void makeTransactions(int amountint[] trans) {
        
int position findNr(trans);
        if (
position == -1) {
            
moveTrans(trans);
            
position findNr(trans);
            
trans[position] = amount;
        } else {
            
trans[position] = amount;
        }
    } 
y el metodo moveTrans lo arregle así:

Código PHP:
public static void moveTrans(int[] trans) {
        
        for (
int i 0trans.length 1i++) {
            
trans[i] = trans[1]; //mueve el elemento a la izquerda, el primer elemento se pierde
        
}
        
        
//en este punto el ultimo espacio esta vacio, se asigna 0
        // y vuelve a makeTransactions
        
        
        
trans[trans.length 1] = 0;
        
    } 
Ahora todo funciona correctamente. Solo les quería pedir un ultimo favor.
Desde el punto de vista de un programador con experiencia (yo estoy recién comenzando en java) como se ve la estructura de la clase? yo se que la posición de los métodos no afecta a la ejecución de la clase pero para leer el código están bien colocados los métodos?

y algo que supongo que dependera del programador, pero dentro del los casos 2 y 3 del switch estoy guardando el valor ingresado en la variable amount en el caso de ingresar dinero uso:

amount = sum;

y para el retiro de dinero:

amount = - sum;

He visto en otros ejemplos por internet que utilizan algo así:

amount = (int) + sum;
amount = (int) - sum;

Que forma es semanticamente mas aceptable?

Aquí les dejo la clase final:

Código PHP:
import java.util.Scanner;

public class 
Bank {

    public static 
void main(String args[]) {
        
Scanner input = new Scanner(System.in);

        
int amount 0choice 0sum 0balance 0;
        
int[] trans = new int[4];

        
//mientras el usuario no decide terminar ingresa al switch

        
while (choice != 4) {
            
choice menu();
            switch (
choice) {
                case 
1:
                    
System.out.print("Ingresar dinero: ");
                    
sum input.nextInt();
                    
amount sum;
                    
makeTransactions(amounttrans);
                    break;

                case 
2:
                    
System.out.print("Sacar dinero: ");
                    
sum input.nextInt();
                    
amount = - sum;
                    
makeTransactions(amounttrans);
                    break;

                case 
3:
                    
showTransactions(transbalance);
                    break;

                default:
                    
System.out.println("Terminar");
                    break;
            }
        }
    }

    
// Muestra el menu y recive la opcion del usuario
    
    
public static int menu() {
        
int choice 0;

        
Scanner input = new Scanner(System.in);
        
System.out.println("Banco");
        
System.out.println("-------------------");
        
System.out.println();
        
System.out.println("1. Ingresar dinero");
        
System.out.println("2. Scar dinero");
        
System.out.println("3. Saldo");
        
System.out.println("4. Terminar");
        
System.out.println();
        
System.out.print("Tu opcion: ");

        
choice input.nextInt();

        return 
choice;
    }

    
    
//Muestra las ultimas 10 transacciones mas el saldo
    
    
public static void showTransactions(int[] transint balance) {
        
System.out.println();
        
System.out.println("Historial: ");
        
System.out.println();

        
// recorre el arreglo. Si la posicion es 0 (vacio) no se imprime
        
for (int i 0trans.lengthi++) {
            if (
trans[i] == 0) {
                
System.out.print("");
            } else {
                
System.out.print(trans[i] + "\n");
                
balance += trans[i]; // se acumula el balance
            
}
        }

        
System.out.println();
        
System.out.println("Saldo: " balance);
        
System.out.println();
    }
    
    
//Coloca la ultima transaccion en el ultimo lugar libre del array
    // si el array esta lleno, moveTrans creara un espacio libre en el array
    
    
public static void makeTransactions(int amountint[] trans) {
        
int position findNr(trans);
        
        if (
position == -1) {
            
moveTrans(trans); // mueve los elementos un lugar a la izquerda
            
position findNr(trans); // obtiene el indice del lugar desocupado
            
trans[position] = amount// se coloca el monto en el lugar indicado por findNr
            
             
        
} else {
            
trans[position] = amount// Aun hay espacios disponibles por lo tanto no se necesita mover nada.
        
}
    }

    
    
// Entrega la posicion en el array en donde la transaccion se guardara
    // si no hay lugares devuelve -1
    
    
public static int findNr(int[] trans) {
        
        
int position = - 1// -1 significa que no hay lugares libres

        
for (int i 0trans.lengthi++) { //recorre el arreglo
            
if (trans[i] == 0) { // si la posicion es 0 (vacio)
                
position i// se guarda el indice en position
                
break;
            }
        }

        return 
position;
    }

    
//Mueve todas las transacciones en el array un lugar para hacer espacio
    //para la nueva transaccion. La transaccion mas antigua se sobreescribe.
    
    
public static void moveTrans(int[] trans) {
        
        for (
int i 0trans.length 1i++) {
            
trans[i] = trans[1]; //mueve el elemento a la izquerda, el primer elemento se pierde
        
}
        
        
//en este punto el ultimo espacio esta vacio, se asigna 0
        // y vuelve a makeTransactions
        
        
        
trans[trans.length 1] = 0;
        
    }
     

Gracias por todo nuevamente.
  #8 (permalink)  
Antiguo 30/09/2011, 12:14
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Mover elementos en un arreglo, problemas

Yo no volvería a utilizar el método findNr si ya sabes que la última posición disponible es la última (piensa en un array que tuviese muchísimas posiciones, tendrías que recorrer todas las posiciones).

Ahora te voy a hacer una recomendación: utiliza las clases para colecciones de Java, que además de ser más eficientes para el caso en el que lo estás utilizando, te van a evitar tanto código.

Por ejemplo, un LinkedList sería perfecto para tu caso y si vas a necesitar acceder a posiciones aleatorias de la colección, entonces ArrayList.

LinkedList es muy buena para el caso en el que insertes o borres elementos que están en los extremos y para recorrerlo de manera secuencial. De igual manera, si necesitas hacer búsquedas en la colección y sólo se pueden hacer de manera secuencial, la diferencia respecto a un array es pequeña y la inserción y borrado son muchísimo más eficientes.

Es tu decisión y si necesitas más consejo aquí estamos.

Sobre el resto de la clase:

1. La variable balance en el main sobra mucho, porque no la usas para nada. Por lo que se observa. la pasas como parámetro al método showTransactions, pero lo ideal sería que definieses esa variable local al método y no la pasases como argumento. A lo mejor me estoy equivocando y estás utilizando la variable en otro sitio que no muestras.

2. No es necesario ese (int) porque esto es un casting (conversión de tipo) a int, pero la variable sum ya es de tipo int, así que no es necesario.

3. Sobre la colocación de los métodos, depende de ti y me parece que no es importante para nada.

EDITO: Te dejo un link sobre Collections en Java: http://www.reloco.com.ar/prog/java/collections.html

Saludos.

Última edición por alexg88; 30/09/2011 a las 12:19
  #9 (permalink)  
Antiguo 01/10/2011, 04:50
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 21 años, 5 meses
Puntos: 2
Respuesta: Mover elementos en un arreglo, problemas

Gracias por las observaciones alexg88. Es cierto la variable balance solo se utiliza dentro de "showTransactions" por lo que puede ser declarada como local y si en el metodo "moveTrans" obtengo el ultimo lugar del arreglo por lo que no necesito buscarlo nuevamente, gracias por esos datos.

Gracias por el link tambien, lo he estado leyendo e intentare hacer la misma clase pero usando LinkedList.

Bueno, yo no se si puedo cerrar este hilo o el administrador es el unico que lo puede hacer, pero por mi parte lo doy como terminado.

Gracias nuevamente!!!

Etiquetas: elementos, jar, arreglos
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 05:06.