Pregunta

Quiero leer en una cuadrícula de números (n * n) de un archivo y copiarlos en una matriz multidimensional, una intercepción a la vez. Tengo el código para leer en el archivo e imprimirlo, pero no sabe cómo tomar cada int. Creo que necesito método splitstring y un delimitador en blanco "" con el fin de tomar todas las Charcter, pero después de eso no estoy seguro. También me gustaría que para cambiar los caracteres en blanco a 0, pero eso puede esperar!

Esto es lo que he conseguido hasta ahora, a pesar de que no funciona.

        while (count <81  && (s = br.readLine()) != null)
        {
        count++;

        String[] splitStr = s.split("");
        String first = splitStr[number];
        System.out.println(s);
        number++;

        }
    fr.close();
    } 

Un archivo de ejemplo es así (se necesitan los espacios):

26     84
 897 426 
  4   7  
   492   
4       5
   158   
  6   5  
 325 169 
95     31

Básicamente sé cómo leer en el archivo e imprimirlo, pero no sabe cómo tomar los datos del lector y lo puso en una matriz multidimensional.

Yo sólo he probado esto, pero dice 'no puede covernt de String [] String'

        while (count <81  && (s = br.readLine()) != null)
    {       
    for (int i = 0; i<9; i++){
        for (int j = 0; j<9; j++)
            grid[i][j] = s.split("");

    }
¿Fue útil?

Solución

Sobre la base de su archivo esta es la forma en que lo haría:

Lint<int[]> ret = new ArrayList<int[]>();

Scanner fIn = new Scanner(new File("pathToFile"));
while (fIn.hasNextLine()) {
    // read a line, and turn it into the characters
    String[] oneLine = fIn.nextLine().split("");
    int[] intLine = new int[oneLine.length()];
    // we turn the characters into ints
    for(int i =0; i < intLine.length; i++){
        if (oneLine[i].trim().equals(""))
            intLine[i] = 0;
        else
            intLine[i] = Integer.parseInt(oneLine[i].trim());
    }
    // and then add the int[] to our output
    ret.add(intLine):
}

Al final de este código, se tendrá una lista de int[] que puede ser fácilmente convertido en un int[][].

Otros consejos

private static int[][] readMatrix(BufferedReader br) throws IOException {
    List<int[]> rows = new ArrayList<int[]>();
    for (String s = br.readLine(); s != null; s = br.readLine()) {
        String items[] = s.split(" ");
        int[] row = new int[items.length];
        for (int i = 0; i < items.length; ++i) {
            row[i] = Integer.parseInt(items[i]);
        }
        rows.add(row);
    }
    return rows.toArray(new int[rows.size()][]);
}

EDIT: Usted acaba de actualizar su puesto para incluir un archivo de entrada de ejemplo, por lo que el siguiente no funcionará tal cual para su caso. Sin embargo, el principio es el mismo -. Tokenize la línea que leer con base en cualquier delimitador que desee (espacios en su caso) y después agregue una de contadores a las columnas de una fila

no incluye un archivo de entrada de ejemplo, por lo que voy a hacer algunas suposiciones básicas.

Si se asume que la primera línea del archivo de entrada es "n", y el resto es el n x n números enteros que desea leer, lo que necesita hacer algo como lo siguiente:

public static int[][] parseInput(final String fileName) throws Exception {
 BufferedReader reader = new BufferedReader(new FileReader(fileName));

 int n = Integer.parseInt(reader.readLine());
 int[][] result = new int[n][n];

 String line;
 int i = 0;
 while ((line = reader.readLine()) != null) {
  String[] tokens = line.split("\\s");

  for (int j = 0; j < n; j++) {
   result[i][j] = Integer.parseInt(tokens[j]);
  }

  i++;
 }

 return result;
}

En este caso, un archivo de entrada ejemplo sería:

3
1 2 3
4 5 6
7 8 9

lo que resultaría en una matriz de 3 x 3 con:

row 1 = { 1, 2, 3 }
row 2 = { 4, 5, 6 }
row 3 = { 7, 8, 9 }

Si el archivo de entrada no tiene "n" como la primera línea, a continuación, puede simplemente esperar para inicializar la matriz final hasta que se haya contado las fichas en la primera línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top