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

[SOLUCIONADO] Matrices en java

Estas en el tema de Matrices en java en el foro de Java en Foros del Web. Querría que el formato en que se mostrase los valores que ha tomado una matric fuese, de por ejemplo si es una 2 x 3: ...
  #1 (permalink)  
Antiguo 09/12/2013, 12:20
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Pregunta Matrices en java

Querría que el formato en que se mostrase los valores que ha tomado una matric fuese, de por ejemplo si es una 2 x 3:

2 3 8
5 7 9

Y no que me lo muestre en una sola fila, que es lo que me sucede con el código que he creado.

Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eliminafilamatriz;
import java.util.*;
/**
 *
 * @author Joan
 */
public class EliminaFilaMatriz {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        Scanner teclado=new Scanner(System.in);
        int n=0, m=0, i, j;
        
        System.out.println("Filas que tendrá la matriz.");
        n=teclado.nextInt();
        
        System.out.println("Columnas que tendrá la matriz.");
        m=teclado.nextInt();
        
        int [][] mxn = new int[n][m];
        
            introMatriz(mxn, n, m);
            muestraMatriz(mxn, n, m);
    }
    
    public static void introMatriz(int [][]mxn, int n, int m){
        int i, j;
            for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                mxn[i][j] = (int)(Math.random()*9 + 1);
                }
            }
    }
    
    public static void muestraMatriz(int [][]mxn, int n, int m){
        int i, j;
        i=n;
        j=m;
        
            for(i=0;i<mxn.length;i++) {
            for(j=0;j<mxn[i].length;j++){
                System.out.print(mxn[i][j]+" / ");
                }
            }
    }
    
}
GRACIAS.
  #2 (permalink)  
Antiguo 09/12/2013, 16:54
 
Fecha de Ingreso: diciembre-2013
Mensajes: 15
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Matrices en java

Saludos.
Debe ser esto lo que quieres.

Código Java:
Ver original
  1. public static void muestraMatriz(int [][]mxn, int n, int m){
  2.         int i, j;
  3.         i=n;
  4.         j=m;
  5.        
  6.             for(i=0;i<mxn.length;i++) {
  7.                 System.out.print("\n");
  8.             for(j=0;j<mxn[i].length;j++){
  9.                 System.out.print(mxn[i][j]+" / ");
  10.                 }
  11.             }
  12.     }
  #3 (permalink)  
Antiguo 10/12/2013, 03:25
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Pregunta Respuesta: Matrices en java

Si, es eso lo que pedía. Pero ahora lo que quiero es quitar una fila y columna a petición del usuario. El código que tengo hecho es el siguiente (esta a medias).

Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eliminafilamatriz;
import java.util.*;
/**
 *
 * @author Joan
 */
public class EliminaFilaMatriz {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        Scanner teclado=new Scanner(System.in);
        int n=0, m=0;
        
        System.out.println("Filas que tendrá la matriz.");
        n=teclado.nextInt();
        
        System.out.println("Columnas que tendrá la matriz.");
        m=teclado.nextInt();
        
        int [][] mxn = new int[n][m];
        int[][] destino = new int[mxn.length - 1][];
        
            introMatriz(mxn, n, m);
            muestraMatriz(mxn, n, m);
            quitaFila(mxn, n, m);
        System.arraycopy(mxn, 0, destino, 0, 1); // copia la primera a la
        
    }
    
    public static void introMatriz(int [][]mxn, int n, int m){
        int i, j;
            for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                mxn[i][j] = (int)(Math.random()*9 + 1);
                }
            }
    }
    
    public static void muestraMatriz1(int [][]mxn, int n, int m){
        int i, j;
        i=n;
        j=m;
        
            for(i=0;i<mxn.length;i++) {
            for(j=0;j<mxn[i].length;j++){
                System.out.print(mxn[i][j]+" / ");
                }
            }
    }
    
    public static void muestraMatriz(int [][]mxn, int n, int m){
        int i, j;
        i=n;
        j=m;
        
            for(i=0;i<mxn.length;i++) {
                System.out.print("\n");
            for(j=0;j<mxn[i].length;j++){
                System.out.print(mxn[i][j]+" ");
                }
            }
    }
    
    public static void quitaFila(int [][]mxn, int n, int m){
        Scanner teclado=new Scanner (System.in);
        int f;
        System.out.print("\n");
        System.out.println("Que fila desea eliminar.");
        f=teclado.nextInt();
        f=f-1;
    }
    
}
  #4 (permalink)  
Antiguo 10/12/2013, 04:31
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Matrices en java

Buenas,
para empezar en el método muestraMatriz no es necesario que le pases el numero de filas y de columnas para imprimir la matriz, puedes omitir eso dejandolo así,

Código Java:
Ver original
  1. public static void muestraMatriz(int [][]mxn){
  2.         int i, j;        
  3.         for(i=0;i<mxn.length;i++) {
  4.             System.out.print("\n");
  5.             for(j=0;j<mxn[i].length;j++){
  6.                 System.out.print(mxn[i][j]+" ");
  7.             }
  8.         }
  9.     }


Para tu segunda pregunta,
Tampoco hace falta que pases los n y m argumentos para llamar a quitarFila, ya que no los vas a usar.
Puedes hacerlo como estas intentando tu utilizando el método ArrayCopy(), lo correcto ya que creas el método quitarFila() sería hacerlo dentro de ese método de la siguiente manera:

Código Java:
Ver original
  1. public static int[][] quitaFila(int [][]mxn){
  2.         Scanner teclado=new Scanner (System.in);
  3.         int f;
  4.         System.out.print("\n");
  5.         System.out.println("Que fila desea eliminar.");
  6.         f=teclado.nextInt();
  7.         f=f-1;
  8.         int[][] destino = new int[mxn.length - 1][];
  9.         int j=0;
  10.         for(int i=0;i<mxn.length;i++){
  11.             if(i!=f){
  12.                 System.arraycopy(mxn, i, destino, j, 1);
  13.                 j++;
  14.             }
  15.         }
  16.        
  17.         return destino;
  18.        
  19.     }

Lo que hace el código es pedir por pantalla la fila que se desea borrar, e ir recorriendo la matriz que se generó anteriormente, y copiando las filas a una matriz secundaria (salvo la fila que se indicó que se almacena en la variable f) y por ultimo retorna la nueva matriz que se ha generado y el main quedaria asi:

Código Java:
Ver original
  1. public static void main(String[] args) {
  2.         Scanner teclado=new Scanner(System.in);
  3.         int n=0, m=0;
  4.        
  5.         System.out.println("Filas que tendrá la matriz.");
  6.         n=teclado.nextInt();
  7.        
  8.         System.out.println("Columnas que tendrá la matriz.");
  9.         m=teclado.nextInt();
  10.        
  11.         int [][] mxn = new int[n][m];
  12.        
  13.         introMatriz(mxn, n, m);
  14.         muestraMatriz(mxn);
  15.         mxn=quitaFila(mxn);
  16.         muestraMatriz(mxn);
  17.        
  18.     }

Por ultimo, viendo que estas aprendiendo. te doy un consejo, la mejor forma de entender estos ejercicios es coger un papel y un bolígrafo y dibujar la matriz y seguir la traza del programa paso a paso, para comprender que se hace y porque y sobretodo intentarlo, una y otra vez y repetir los ejercicios hasta que se comprendan.

Un saludo.
  #5 (permalink)  
Antiguo 10/12/2013, 08:50
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Matrices en java

¿Para eliminar columnas? ¿Sería un método parecido al de eliminar filas?
  #6 (permalink)  
Antiguo 10/12/2013, 09:05
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Matrices en java

Cita:
Iniciado por SilverDante Ver Mensaje
¿Para eliminar columnas? ¿Sería un método parecido al de eliminar filas?
Para eliminar columnas no existe un método como ArrayCopy(que yo sepa) que copie una columna directamente, así que tendrás que ir recorriendo la matriz y hacer una copia de lo que te interese en un objeto secundario.

Intentalo y postea tu código.

Saludos!
  #7 (permalink)  
Antiguo 10/12/2013, 09:14
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Matrices en java

Lo que estoy intentando es mover los valores de una posición a otra, dejando fuera los de la columna que se desea eliminar. Para hacer la matriz una columna más corta, ¿valdría esto?

Código:
        int [][] mxn = new int[n][m];
        int[][] destino = new int[mxn.length - 1][];
        int[][] destino2 = new int[destino.length][m-1]; /*donde el valor de "m" es el de las columnas*/
  #8 (permalink)  
Antiguo 10/12/2013, 09:23
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Matrices en java

en base a lo anterior, intento borrar la columna de este modo:

Código:
    public static int[][] quitaColumna(int [][]m, int n){
        Scanner teclado=new Scanner (System.in);
        int c;
        System.out.print("\n");
        System.out.println("Que columna desea eliminar.");
        c=teclado.nextInt();
        c=c-1;
        
        int[][] destino = new int[m.length][n - 1];
        
        int i, j;
            for (i = 0; i < m.length; i++) {
            for (j = 0; j < n; j++) {
                if(j!=c)
                destino[i][j] = m[i][j];
                }
            }
        
        return destino;
        
    }
Codigo completo:
Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eliminafilamatriz;
import java.util.*;
/**
 *
 * @author Joan
 */
public class EliminaFilaMatriz {

    /**
     * @param args the command line arguments
     */
    
    public static void main(String[] args) {
        Scanner teclado=new Scanner(System.in);
        int n=0, m=0;
        
        System.out.println("Filas que tendrá la matriz.");
        n=teclado.nextInt();
        
        System.out.println("Columnas que tendrá la matriz.");
        m=teclado.nextInt();
        
        int[][] mxn = new int[n][m];
        int[][] destino = new int[mxn.length - 1][];
        int[][] destino2 = new int[destino.length][m-1];
        
            introMatriz(mxn, n, m);
            muestraMatriz(mxn);
            destino=quitaFila(mxn);
            muestraMatriz(destino);
            destino2=quitaColumna(destino,m);
            muestraMatriz(destino2);
    }
    
    public static void introMatriz(int [][]mxn, int n, int m){
        int i, j;
            for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                mxn[i][j] = (int)(Math.random()*9 + 1);
                }
            }
    }
    
    public static void muestraMatriz(int [][]m){
        int i, j;        
        for(i=0;i<m.length;i++) {
            System.out.print("\n");
            for(j=0;j<m[i].length;j++){
                System.out.print(m[i][j]+" ");
            }
        }
        System.out.print("\n");
    }
    
    public static int[][] quitaFila(int [][]m){
        Scanner teclado=new Scanner (System.in);
        int f;
        System.out.print("\n");
        System.out.println("Que fila desea eliminar.");
        f=teclado.nextInt();
        f=f-1;
        int[][] destino = new int[m.length - 1][];
        int j=0;
        for(int i=0;i<m.length;i++){
            if(i!=f){
                System.arraycopy(m, i, destino, j, 1);
                j++;
            }
        }
        
        return destino;
        
    }
    
    public static int[][] quitaColumna(int [][]m, int n){
        Scanner teclado=new Scanner (System.in);
        int c;
        System.out.print("\n");
        System.out.println("Que columna desea eliminar.");
        c=teclado.nextInt();
        c=c-1;
        
        int[][] destino = new int[m.length][n - 1];
        
        int i, j;
            for (i = 0; i < m.length; i++) {
            for (j = 0; j < n; j++) {
                if(j!=c)
                destino[i][j] = m[i][j];
                }
            }
        
        return destino;
        
    }
}

Última edición por SilverDante; 10/12/2013 a las 10:04
  #9 (permalink)  
Antiguo 10/12/2013, 10:29
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Matrices en java

si te fijas en el resultado que te da, lo que te ocurre es que la columna que deseas borrar pasa a valer 0 y una de las columnas queda sin copiar en la nueva matriz, eso es porque la nueva matriz no almacena los valores correctamente

Imaginandonos que quieres borrar la columna 1 de la siguiente matriz,

1 2 3
1 2 3
1 2 3
^
Queremos borrar esta

Aqui:
Código Java:
Ver original
  1. if(j!=c)
  2.        destino[i][j] = m[i][j];
  3. }

en la primera iteración J vale 0 y C vale 0 también entonces en la matriz "destino" en la posición destino[0][0] no se inserta nada... y J pasa a valer J+1, entonces esa posición de la matriz pasa a cargarse con 0 por defecto.
Por eso cada vez que J vale lo mismo que C se inserta 0.

Es decir, tienes que usar una variable auxiliar que haga referencia a las nueva matriz así:


Código Java:
Ver original
  1. public static int[][] quitaColumna(int [][]mxn){
  2.         Scanner teclado=new Scanner (System.in);
  3.         int f;
  4.         System.out.print("\n");
  5.         System.out.println("Que columna desea eliminar.");
  6.         f=teclado.nextInt();
  7.         f=f-1;
  8.         int[][] destino = new int[mxn.length][mxn[0].length-1];      
  9.         for(int fil=0;fil<mxn.length;fil++){
  10.             for(int col=0, k=0;col<mxn[0].length;col++){
  11.                 if(col!=f){
  12.                     destino[fil][k]=mxn[fil][col];
  13.                     k++;
  14.                 }
  15.             }
  16.         }
  17.         return destino;        
  18.     }

Pruebalo y modifica el código y como te dije haz una traza paso a paso para verlo claramente :).

¿Que estas preparando exámenes?

Un saludo.

PD.

para hacer referencia a las columnas... se hace como hago yo en el for interno para recorrer la matriz

matriz[0].length

no hace falta que pases el tamaño como parámetro ;)
  #10 (permalink)  
Antiguo 10/12/2013, 10:44
 
Fecha de Ingreso: diciembre-2013
Mensajes: 36
Antigüedad: 10 años, 4 meses
Puntos: 1
Pregunta Respuesta: Matrices en java

En "quitaColumna" dentro del FOR haces otro FOR, y hay una "k", ¿para que la utilizas?

PD: no, es una actividad para trabajar con matrices, la veo un poco compleja. XD
  #11 (permalink)  
Antiguo 11/12/2013, 01:31
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Matrices en java

Cita:
Iniciado por SilverDante Ver Mensaje
En "quitaColumna" dentro del FOR haces otro FOR, y hay una "k", ¿para que la utilizas?

PD: no, es una actividad para trabajar con matrices, la veo un poco compleja. XD
Pues veamos, a ver como te lo explico.
Tenemos una matriz de por ejemplo 3x3, para quitar una columna lo que haces es copiar los datos que te interesan de esa matriz en otra matriz que sera de tamaño 3x2 ya que vas a quitar una columna.

tu lo que hacías en tu ejemplo es recorrer la matriz y en cada posición hacer la siguiente comprobación

Código Java:
Ver original
  1. if(j!=c)
  2.        destino[i][j] = m[i][j];
  3. }

el problema aquí es que con el for estas recorriendo la matriz original que es de 3x3 entonces I y J van a llegar a valer 2, es decir se ira accediendo a la matriz de la siguiente forma:

destino[0][0] = m[0][0]; <---BIEN
destino[0][1] = m[0][1]; <---BIEN
destino[0][2] = m[0][2]; <---MAL, ERROR

La nueva matriz es de tamaño 3x2 porque se lo indico en la siguiente linea que precede a los for:

Código Java:
Ver original
  1. int[][] destino = new int[mxn.length][mxn[0].length-1];

Entonces al intentar acceder a la posición destino[0][2] se lanzara un error

Código Java:
Ver original
  1. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

Ya que esa posición no existe en la nueva matriz.

Para arreglarlo, en vez de utilizar la variable J ( en tu caso) o col(en el mio), utilizo una variable auxiliar K que solo incremento cuando realizo copia de una matriz a otra, de esta forma K no llega a valer 2.

¿Lo entendiste?
Vuelvo a repetirte que es mejor que vayas dibujando en un papel! porque mentalmente sino estas aconstumbrado te costará!

Etiquetas: columnas, filas, matrices, string
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 12:07.