Java - Ayuda en ejercicio de matrices!!!

 
Vista:
sin imagen de perfil

Ayuda en ejercicio de matrices!!!

Publicado por anonymous (11 intervenciones) el 16/04/2022 21:55:08
Buenas tardes, estoy hace días con este ejercicio y no consigo resolverlo, he probado de mil maneras y ya no se que mas hacer, si me podrían ayudar les agradecería mucho.
Saludos

A continuación adjunto el ejercicio:

Se ingresa la cantidad m de filas y la cantidad n de columnas. Luego se ingresa una matriz binaria de m * n. Se debe mostrar una nueva matriz de la misma cantidad de columnas, pero que contenga las filas sin repetirlas, esto es, se muestra sólo la primera aparición de cada fila repetida.

Ejemplo para m=4, n=5:
0 1 0 0 1
1 0 1 1 0
0 1 0 0 1
1 0 1 0 0

mostrará:
0 1 0 0 1
1 0 1 1 0
1 0 1 0 0

Input Format

Se ingresa m, n y la matriz.

Constraints

m, n entre 1 y 10.

Output Format

Mostrar la matriz por filas, sin repetirla
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda en ejercicio de matrices!!!

Publicado por Kabuto (1381 intervenciones) el 17/04/2022 12:54:12
Hola.
Aquí la clave para no volverse loco creando un código demasiado complicado, es "modular" el código creando métodos que se dediquen a tareas muy específicas.

Mira, este podría ser el código de la clase main.
Fíjate en la parte que resalto en negrita, que es donde se recorre la matriz para mostrar las filas, excepto las que estén repetidas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
 
		System.out.print("Indique cantidad de filas(1-10): ");
		int m = teclado.nextInt();
		if (m < 1)
			m = 1;
		else if (m > 10)
			m = 10;
		System.out.print("Indique cantidad de columnas(1-10): ");
		int n = teclado.nextInt();
		if (n < 1)
			n = 1;
		else if (n > 10)
			n = 10;
		//Creamos matriz
		int[][] matriz = new int[m][n];
		System.out.println("\nRellene la matriz con números.");
		for (int i = 0; i < m; i++) {
			System.out.println("Valores de la fila #" + (i+1));
			for (int j = 0; j < n; j++) {
				System.out.print("Valor: ");
				matriz[ i][j] = teclado.nextInt();
			}
		}
 
		//Ahora la recorremos para mostrarla, pero omitiendo filas repetidas
		System.out.println("\nMatriz insertada (se omiten filas repetidas)");
		for (int i = 0; i < matriz.length; i++)
			if (!esRepetida(i, matriz)) //Si esta fila NO está repetida en la matriz
				System.out.println(Arrays.toString(matriz[ i])); //entonces la mostramos
 
		System.out.println("\n\t\tFIN DE PROGRAMA");
		teclado.close();
 
	}

En esa parte en negrita, me ayudo de un método llamado esRepetida() al cuál le paso el índice de la fila que tengo que decidir si mostrar o no en pantalla y también le paso la matriz a la que pertenece.
Este método se encarga exclusivamente de decirme si esa fila, está repetida en la matriz. Entonces, si NO lo está, la muestro en pantalla.
Si estuviera repetida, no hago nada, dejo que el bucle continúe y paso a la siguiente fila.

De esta manera, consigo que el método main no sea demasiado complicado y se entiende fácilmente cuál es la lógica que se está siguiendo (si está repetida, no muestro fila. Si no lo está, entonces la muestro)

Bien, pues vamos a ver ahora el código de ese método.
He incluido varios comentarios que ya sirven de explicación.
Básicamente lo que hace es recorrer la matriz con un bucle, partiendo desde el índice de la fila que le he indicado entre paréntesis, pero hacia atrás.
Vamos hacia atrás porque queremos saber si previamente a esta fila, existe otra que sea igual.
Si el bucle termina sin encontrar ninguna que sea igual, retornaremos FALSE para indicar que esta fila no es repetida y por tanto puede mostrarse en pantalla.
Pero si se encuentra una fila igual, entonces sí es repetida y retornamos TRUE inmediatamente sin esperar a que termine el bucle.

Fíjate que aquí, de nuevo, uso otro método para ayudar a que el código no se complique en exceso. Lo marco en negrita.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static boolean esRepetida(int indiceFila, int[][] matriz) {
		/*
		 * Consideraremos que una fila está repetida si encontramos
		 * una fila igual en una posicion ANTERIOR a la fila que consultamos.
		 * No revisamos las filas POSTERIORES, solo las ANTERIORES.
		 * De esta manera la primera aparición de una fila repetida,
		 * no se considerará como tal.
		 * Solo se considerarán repetidas las siguientes apariciones de esa fila
		 */
 
		//La primera fila (indiceFila = 0) nunca se va a considerar como repetida
		//porque no hay filas ANTERIORES con las que comparar
		if (indiceFila == 0)
			return false;
		else {
			//Con un bucle recorremos las filas ANTERIORES
			for (int i = (indiceFila-1); i >= 0; i--) {
				//Si encontramos una fila repetida, retornamos TRUE
				if (filasIguales(matriz[indiceFila], matriz[ i]))
					return true; //Fila repetida encontrada
			}
			//Bucle FOR no ha encontrado filas repetidas, retornamos false
			return false;
		}
 
	}

Ese método, se encarga exclusivamente de recibir dos filas, es decir, dos arrays de una dimensión y comprobar si sus elementos coinciden en valor y posición para determinar si son iguales o no.
Este es el código:
1
2
3
4
5
6
7
8
9
10
11
private static boolean filasIguales(int[] fila1, int[] fila2) {
		//Recorremos las filas comparando elementos.
		//si alguno NO coincide, retornamos FALSE porque son filas DISTINTAS.
		for (int i = 0; i < fila1.length; i++)
			if (fila1[i] != fila2[i])//¿Son elementos distintos?
				return false; //Pues entonces retornamos FALSE
 
		//Si el bucle FOR ha finalizado su recorrido sin retornar FALSE
		//significa que todos los elementos comparados coinciden y tenemos dos filas IGUALES
		return true;
	}

Como ves, el código de estos métodos por separado, no son demasiado complicados. Si quitásemos los comentarios, se quedan en muy poquitas líneas.

Así que en realidad podríamos haber puesto todo este código junto en el método main sin tener que escribir dos métodos más.
Pero entonces tendríamos un código con demasiadas líneas intrincadas, difícil de escribir y aún mucho más difícil de leer y entender la lógica que se está empleando.

En cambio, modulando el programa en métodos separados, el código queda mejor organizado y más legible a primera vista.
Por eso es importante detectar que tareas nos conviene delegar en métodos de apoyo.

Y no es difícil detectar dichas tareas, basta con primero detenerse a pensar la lógica que debemos aplicar:
- Para hacer lo que nos pide el enunciado, necesitamos comprobar si una fila esta repetida.
- Y para comprobar si una fila está repetida, necesitamos saber cómo determinar si dos filas son iguales

Pues esas son las tareas que hemos trabajado en métodos separados. Dividiendo el ejercicio propuesto en pequeños objetivos, conseguiremos completar su totalidad.

Espero haberte ayudado.
Pregunta si algo no se ha entendido bien.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda en ejercicio de matrices!!!

Publicado por anonymous (11 intervenciones) el 17/04/2022 23:06:21
Muchas gracias!! Es que yo lo había hecho de esa manera pero había un paso que estaba mal y me hiciste dar cuenta. Solo hay un detalle, me pide que el resultado lo de sin comas ni paréntesis, osea un ejemplo:
El resultado tendría que ser así:
0 1 0 0 1
1 0 1 1 0
1 0 1 0 0

Y el programa lo da así:

[0, 1, 0, 0, 1]
[1, 0, 1, 1, 0]
[1, 0, 1, 0, 0]

Estuve viendo pero no sé como solucionarlo, te agradecería si me ayudas.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda en ejercicio de matrices!!!

Publicado por Kabuto (1381 intervenciones) el 17/04/2022 23:58:28
El cómo se muestra en pantalla debería ser irrelevante porque es algo estético. Lo que importa es comprender la lógica de la programación.

En mi programa sale con corchetes y comillas porque, para no liar más el código en algo estético, para mostrar las filas uso el método toString() de la clase Arrays el cuál está programado para mostrarlo de esa manera.

Pero si quieres que salgan solo los números, simplemente hay que usar un bucle anidado para imprimir cada elemento por separado.
Marco en negrita
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
 
		System.out.print("Indique cantidad de filas(1-10): ");
		int m = teclado.nextInt();
		if (m < 1)
			m = 1;
		else if (m > 10)
			m = 10;
		System.out.print("Indique cantidad de columnas(1-10): ");
		int n = teclado.nextInt();
		if (n < 1)
			n = 1;
		else if (n > 10)
			n = 10;
		//Creamos matriz
		int[][] matriz = new int[m][n];
		System.out.println("\nRellene la matriz con números.");
		for (int i = 0; i < m; i++) {
			System.out.println("Valores de la fila #" + (i+1));
			for (int j = 0; j < n; j++) {
				System.out.print("Valor: ");
				matriz[i][j] = teclado.nextInt();
			}
		}
 
		//Ahora la recorremos para mostrarla, pero omitiendo filas repetidas
		System.out.println("\nMatriz insertada (se omiten filas repetidas)");
		for (int i = 0; i < matriz.length; i++)
			if (!esRepetida(i, matriz)) {
				System.out.println(); //Salto de linea para imprimir los elementos de esta fila
				for (int j = 0; j < matriz[i].length; j++)
					System.out.print(matriz[i][j] + " "); //Mostramos cada uno de los elementos
			}
 
		System.out.println("\n\t\tFIN DE PROGRAMA");
		teclado.close();
 
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda en ejercicio de matrices!!!

Publicado por anonymous (11 intervenciones) el 18/04/2022 01:58:46
Sisi ya sé que es algo estético, pero en mi universidad ponen el ejercicio en un programa que para corregirlo prueba el código con ciertos ejemplos y si la respuesta no es exactamente igual a la del programa lo marca como mal... Por eso quiero que salga sin paréntesis.
Probé con el código que me mandaste y me sale así:
0
1
0
0
1

1
0
1
1
0

1
0
1
0
0

Y debería salir:

0 1 0 0 1
1 0 1 1 0
1 0 1 0 0

No sé si me podrías ayudar, mil disculpas por seguir molestando...
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda en ejercicio de matrices!!!

Publicado por anonymous (11 intervenciones) el 18/04/2022 03:41:46
Bueno, ya pude arreglarlo. Pero sigue habiendo un pequeño error. La respuesta me la da con dos espacios arriba, y el programa que le comenté lo toma como mal. Osea debería ser:
0 1 0 0 1
1 0 1 1 0
1 0 1 0 0

Y el código da:

0 1 0 0 1
1 0 1 1 0
1 0 1 0 0

Adjunto foto:
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda en ejercicio de matrices!!!

Publicado por Kabuto (1381 intervenciones) el 18/04/2022 11:44:07
¿Ves la línea que marco en negrita?
1
2
3
4
5
6
for (int i = 0; i < matriz.length; i++)
			if (!esRepetida(i, matriz)) {
				System.out.println(); //Salto de linea para imprimir los elementos de esta fila
				for (int j = 0; j < matriz[i].length; j++)
					System.out.print(matriz[i][j] + " "); //Mostramos cada uno de los elementos
			}

Es la que hace un salto de línea ANTES de que el bucle for empezar a imprimir los elementos de cada fila.
Si la ponemos debajo del bucle for, entonces lo hará DESPUES de que se hayan imprimido esos elementos.
1
2
3
4
5
6
7
8
for (int i = 0; i < matriz.length; i++)
			if (!esRepetida(i, matriz)) {
 
				for (int j = 0; j < matriz[i].length; j++)
					System.out.print(matriz[i][j] + " "); //Mostramos cada uno de los elementos
 
				System.out.println(); //Salto de linea para imprimir los elementos de esta fila
			}

La matriz se muestra igual, pero ahora ya no hay ese espacio extra al inicio.

Me sorprende un poco esta preocupación por tener el resultado exactamente como muestra el ejemplo, cuando parece que donde hace falta esfuerzo real es en comprender el código, pues debería haber sido fácil deducir que todo era cuestión de cambiar la ubicación de ese salto de línea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda en ejercicio de matrices!!!

Publicado por anonymous (11 intervenciones) el 18/04/2022 22:13:12
muchas gracias por su ayuda!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar