[DUDA] Matrices (arrays bidimensionales) y listas {JAVA}


yeyoloko11

Miembro muy activo
Noder
Que pasa chavales!?

Alguno que maneje del tema puede ayudarme a plantear el ejercicio, no quiero la solución solo una ayuda para guiarme a la realización del ejercicio ya que estoy un poco atrancado. Gracias de antemano ^^


Ejercicio – Matrices (arrays bidimensionales) y listas


El gobierno municipal del pueblo de Sagrillas, está preocupado por las próximas fiestas ilegales de nochevieja y la cantidad de contagiados de la Covid-19 que pueden producirse.
Por ello, ha desarrollado un modelo matemático que a partir del número de personas y el tiempo de exposición a los contagiados, es capaz de determinar cuántos contagiados hay en cada periodo de 15 minutos (tiempo que se supone necesario para que una persona contagiada, contagie a otra que se encuentra a una distancia inferior a 2 metros).

Los estudios actuales determinan que cada persona contagiada, solo puede contagiar a aquellos que se encuentran a una distancia inferior a 2 metros (celdas contiguas en una matriz), y en una posición en línea recta (arriba, abajo, izquierda o derecha), ya que no hay datos suficientes que indiquen que la transmisión también se produce en diagonal.

El programa consiste en leer de un fichero los datos correspondientes a las personas (contagiados y no contagiados) y su ubicación dentro de la sala. El programa irá mostrando en forma de matriz cuadrada (puede ser de cualquier tamaño), como cambia el número de contagiados cada vez que transcurran 15 minutos, hasta el momento en que todas las personas de la sala se encuentren contagiadas.

Un fichero de entrada de ejemplo sería el siguiente, donde cada línea tiene un número de tres cifras con el siguiente significado:

XYZ
• X: fila de la celda
• Y: columna de la celda
• Z: valor de la celda –> 1 (no contagiado) / 2 (contagiado).

Por ejemplo, 002 significa que en la celda (0,0) hay una persona contagiada.

1611223048652.png



A continuación, se muestra un ejemplo de cómo funciona el programa.


1611223085097.png



*Adjunto la clase Celda.java *
 

a000

Miembro muy activo
Nodero
Noder
Pues para empezar tendrás que leer el fichero para crear un array bidimensional con los datos. Luego cuando quieras hacer que pasan 15mins copias la matriz para tener una inicial y otra final en la que irás poniendo los nuevos contagios. Recorres la inicial y si en (x,y) su valor es 2 haces que en la final sea 2 en las celdas (x-1), (x+1), (y-1) e (y+1), tendrás que comprobar que estas celdas no se salen fuera de la matriz y te de indexOutOfBounds. Por último devuelves la matriz final.
 

CanopusHMB

Miembro activo
Pues para empezar tendrás que leer el fichero para crear un array bidimensional con los datos. Luego cuando quieras hacer que pasan 15mins copias la matriz para tener una inicial y otra final en la que irás poniendo los nuevos contagios. Recorres la inicial y si en (x,y) su valor es 2 haces que en la final sea 2 en las celdas (x-1), (x+1), (y-1) e (y+1), tendrás que comprobar que estas celdas no se salen fuera de la matriz y te de indexOutOfBounds. Por último devuelves la matriz final.
Buen método, por añadirle algo al compañero, podrías que en cada iteración que suponen esos 15 minutos, metas cada matriz resultante en una Lista para que se puedan consultar.
Así si quieres saber el estado de la fiesta en un intervalo de 15 minutos concreto, solo debes consultar la matriz de la lista con índice: (MINUTOS / 15) - 1
 
  • Like
Reacciones : yeyoloko11

elbartoo

Miembro muy activo
Noder
Para temas de abrir ficheros depende que formato te den pero lo mas comun es usar un filereader y un buffered reader y vas pasando linea por linea con while((linea=br.readLine())!=null) donde br es el buffered reader.

En la variable linea tienes el contenido de esa linea del archivo. Ahora tienes que trabajarla para separar los distintos valores que depende como vayan separados puedes usar String tokenizer.

Lo de los 15 minutos nose a que te refieres, si tienes que hacero con tiempo real puedes usar un Thread o TimerTask sencillo que cada x minutos actulize la matriz. Luego la logica de las matrices te la han dejado medio resuelta arriba

Cualquier cosa me dices sin problemo.
 
  • Maravilloso
Reacciones : yeyoloko11

yeyoloko11

Miembro muy activo
Noder
EDITO : He conseguido crear la matriz bidimensional como la quería donde X es el primer numero Y el segundo y Z el resultado de la matriz en esa posicion inicial [x] [y] = Z;

Java:
public class Tarea5Ejer2 {

package tarea5ejer2;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Tarea5Ejer2 {

    public static void main(String[] args) {

        try {
            FileReader fr = new FileReader("C:/Users/YEYO/Desktop/DAW/Programacion/PROYECTOS/Tarea5Ejer2/src/tarea5ejer2/ARCHIVO.txt");
            BufferedReader br = new BufferedReader(fr);

            int c = 0;
            char ini[][] = new char[3][3];
            String x = "", y = "", z = "";

            String linea;
            while ((linea = br.readLine()) != null) {

                x += linea.charAt(0);
                y += linea.charAt(1);
                z += linea.charAt(2);
            }

            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {

                    if (i == x.charAt(i) && j == y.charAt(j))
;
                    ini[i][j] = z.charAt(c);
                    c++;
                }
            }

            c = 1;
            System.out.println("Matriz inicial : ");
            
            for (int i = 0; i < (ini.length); i++) {
                for (int j = 0; j < ini.length; j++) {

                    System.out.print(ini[i][j] + " ");
                    
                    if (c % 3 == 0) {
                        System.out.println("");

                    }
                    c++;
                }

                }

            }catch (IOException e) {
            System.out.println("Excepcion leyendo fichero ");
        }

        }

    }

}

Código:
ARCHIVO.TXT

002
011
021
101
111
121
201
211
222
 
Última edición:

elbartoo

Miembro muy activo
Noder
Joder no consigo crear la matriz correctamente con los datos del archivo dónde:

Java:
public class Tarea5Ejer2 {

    public static void main(String[] args) {

        try {
            FileReader fr = new FileReader("C:/Users/YEYO/Desktop/DAW/Programacion/PROYECTOS/Tarea5Ejer2/src/tarea5ejer2/ARCHIVO.txt");
            BufferedReader br = new BufferedReader(fr);

            int c = 0;
            char ini[][] = new char[10][10];
            String x = "", y = "", z = "";

            String linea;
            while ((linea = br.readLine()) != null) {
                x += linea.charAt(0);
                y += linea.charAt(1);
                z += linea.charAt(2);
            }

            for (int i = x.charAt(0); i < x.length(); i++) {
                for (int j = y.charAt(0); j < y.length(); j++) {

                    if (c >= 0 && c < 10) {

                        ini[i][j] += z.charAt(c);
                        c++;


                    }

                }

            }

            fr.close();
        } catch (IOException e) {
            System.out.println("Excepcion leyendo fichero ");
        }

    }

}

Código:
ARCHIVO.TXT

002
011
021
101
111
121
201
211
222
deja el txt por aqui que lo miro
 
  • Like
Reacciones : yeyoloko11

yeyoloko11

Miembro muy activo
Noder
EDITO : He conseguido crear la matriz bidimensional como la queria donde X es el primer numero Y el segundo y Z el resultado de la matriz en esa posicion inicial [x] [y] = Z;

Java:
public class Tarea5Ejer2 {

    public static void main(String[] args) {

        try {
            FileReader fr = new FileReader("C:/Users/YEYO/Desktop/DAW/Programacion/PROYECTOS/Tarea5Ejer2/src/tarea5ejer2/ARCHIVO.txt");
            BufferedReader br = new BufferedReader(fr);

            int c = 0;
            char ini[][] = new char[3][3];
            String x = "", y = "", z = "";

            String linea;
            while ((linea = br.readLine()) != null) {

                x += linea.charAt(0);
                y += linea.charAt(1);
                z += linea.charAt(2);
            }

            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {

                    if (i == x.charAt(i) && j == y.charAt(j))
;
                    ini[i][j] = z.charAt(c);
                    c++;
                }
            }
          
          
            for (char a []: ini) {
              
                System.out.println(a);
              
            }

            fr.close();
        } catch (IOException e) {
            System.out.println("Excepcion leyendo fichero ");
        }

    }

}

Código:
ARCHIVO.TXT

002
011
021
101
111
121
201
211
222

El output de este código me imprime esto por pantalla :

1611420009062.png
 

Adjuntos

  • 1611419248781.png
    1611419248781.png
    19 KB · Visitas: 15
Última edición:

a000

Miembro muy activo
Nodero
Noder
El output de este código me imprime esto por pantalla :

Ver el archivo adjunto 17712
Ahora te hace una matriz pero no la correcta no?
Yo creo que te estás complicando mucho para algo muy sencillo. Crea la matriz que mida lo que ocupa la primera línea x el numero de líneas.
Luego recorre todas las líneas y mientras recorres una línea recorre los caracteres y los vas añadiendo a la matriz

String s;
for (int x = 0; x < alto; x++){
s = leerLineaNueva;
for (int y = 0; y<ancho ; y++){
matriz[x][y] = s.charAt( x )
}}

Sería algo de este royo, el nombre de las funciones me lo he inventado pero ya me entiendes
 
  • Like
Reacciones : yeyoloko11

yeyoloko11

Miembro muy activo
Noder
Ahora te hace una matriz pero no la correcta no?
Yo creo que te estás complicando mucho para algo muy sencillo. Crea la matriz que mida lo que ocupa la primera línea x el numero de líneas.
Luego recorre todas las líneas y mientras recorres una línea recorre los caracteres y los vas añadiendo a la matriz

String s;
for (int x = 0; x < alto; x++){
s = leerLineaNueva;
for (int y = 0; y<ancho ; y++){
matriz[x][y] = s.charAt( x )
}}

Sería algo de este royo, el nombre de las funciones me lo he inventado pero ya me entiendes

Finalmente si la verdad que he dado muchas vueltas pero esque lo he intentado de muchas maneras y está es la unica que lo he conseguido, ya tengo la matriz inicial correcta como en la imagen principal:

1611420073415.png
 

yeyoloko11

Miembro muy activo
Noder
Java:
public class Ta5Ejer2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try {

            FileReader fr = new FileReader("C:\\Users\\YEYO\\Desktop\\DAW\\Programacion\\PROYECTOS\\Ta5Ejer2\\src\\ta5ejer2\\ARCHIVO.txt");
            BufferedReader br = new BufferedReader(fr);

            String linea = "", x = "", y = "", z = "";
            int tamaño = 0;

            while ((linea = br.readLine()) != null) {

                x += linea.charAt(0);
                y += linea.charAt(1);
                z += linea.charAt(2);

                tamaño++;
            }

            int tamañoCelda = tamaño;
            tamaño = (int) Math.sqrt(tamaño);
            char matriz[][] = new char[tamaño][tamaño];
            Celda[] celdasContagiadas = new Celda[tamañoCelda];

            System.out.println("Tiempo = 0 minutos");
            System.out.println("Matriz inicial : ");

            String contagiados = "Lista inicial de contagiados: [";
            int o = 0;
            for (int i = 0; i < matriz.length; i++) {
                for (int j = 0; j < matriz.length; j++) {

                    matriz[i][j] += z.charAt(o);

                    if (matriz[i][j] == '2') {
                        celdasContagiadas[o] = new Celda(i, j);
                    }
                    o++;

                    if (o % 3 == 0) {
                        System.out.println(matriz[i][j] + " ");
                    } else {
                        System.out.print(matriz[i][j] + " ");
                    }
                }

            }

            System.out.print(contagiados);
            for (Celda caramba : celdasContagiadas) {

                if (caramba != null) {
                    System.out.print(caramba);
                }

            }
            System.out.println("]" + "\n");

            char cpmatriz[][] = matriz.clone();

            System.out.println("Tiempo = 15 minutos");
            System.out.println("Matriz actual: ");

            for (int i = 0; i < celdasContagiadas.length; i++) {

                if (celdasContagiadas[i] != null) {

                    Celda celda = celdasContagiadas[i];

                    int fila = celda.getFila();
                    int columna = celda.getColumna();

                    if (fila > 0) {
                        cpmatriz[fila - 1][columna] = '2';
                    }

                    if (fila < matriz.length - 1) {
                        cpmatriz[fila + 1][columna] = '2';
                    }

                    if (columna > 0) {
                        cpmatriz[fila][columna - 1] = '2';
                    }

                    if (columna < matriz.length - 1) {
                        cpmatriz[fila][columna + 1] = '2';
                    }

                }
            }

            o = 1;
            for (int i = 0; i < cpmatriz.length; i++) {
                for (int j = 0; j < cpmatriz.length; j++) {

                    if (cpmatriz[i][j] == '2') {

                        celdasContagiadas[o - 1] = new Celda(i, j);

                    }

                    if (o % 3 == 0) {
                        System.out.println(cpmatriz[i][j] + " ");
                    } else {
                        System.out.print(cpmatriz[i][j] + " ");
                    }
                    o++;
                }

            }

            System.out.print(contagiados);
            for (Celda caramba : celdasContagiadas) {

                if (caramba != null) {
                    System.out.print(caramba);
                }

            }
            System.out.println("]" + "\n");

            System.out.println("Tiempo = 30 minutos");
            System.out.println("Matriz actual: ");

            for (int i = 0; i < celdasContagiadas.length; i++) {

                if (celdasContagiadas[i] != null) {

                    Celda celda = celdasContagiadas[i];

                    int fila = celda.getFila();
                    int columna = celda.getColumna();

                    if (fila > 0) {
                        cpmatriz[fila - 1][columna] = '2';
                    }

                    if (fila < matriz.length - 1) {
                        cpmatriz[fila + 1][columna] = '2';
                    }

                    if (columna > 0) {
                        cpmatriz[fila][columna - 1] = '2';
                    }

                    if (columna < matriz.length - 1) {
                        cpmatriz[fila][columna + 1] = '2';
                    }

                }
            }

            o = 1;
            for (int i = 0; i < cpmatriz.length; i++) {
                for (int j = 0; j < cpmatriz.length; j++) {

                    if (cpmatriz[i][j] == '2') {

                        celdasContagiadas[o - 1] = new Celda(i, j);

                    }

                    if (o % 3 == 0) {
                        System.out.println(cpmatriz[i][j] + " ");
                    } else {
                        System.out.print(cpmatriz[i][j] + " ");
                    }
                    o++;
                }

            }

            System.out.print(contagiados);
            for (Celda caramba : celdasContagiadas) {

                if (caramba != null) {
                    System.out.print(caramba);
                }

            }
            System.out.println("]" + "\n");

        } catch (FileNotFoundException e) {
            System.out.println("No se ha encontrado el archivo especificado");
        } catch (IOException ex) {
            System.out.println("hola");
        }

    }
}



CELDA.JAVA
Java:
/*
 * 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 ta5ejer2;

/**
 *
 * @author lucasjosemoraleschacon
 */
public class Celda {

    private int fila;
    private int columna;

    public Celda() {
        this.fila = 0;
        this.columna = 0;
    }

    public Celda(int fila, int columna) {
        this.fila = fila;
        this.columna = columna;
    }

    public int getFila() {
        return fila;
    }

    public void setFila(int fila) {
        this.fila = fila;
    }

    public int getColumna() {
        return columna;
    }

    public void setColumna(int columna) {
        this.columna = columna;
    }

    @Override
    public String toString() {
        return "(" + this.getFila() + "," + this.getColumna() + ")";
    }

}



Output:

1611748329885.png



¿Alguna recomendación para automatizar más el código o crear métodos para no repetir tanto código? También he pensado de crear un ArrayList en vez de un array para celdasContagiadas