Java Чтение файла и сохранение их в массивах 2d [дубликат]

Исходные типы прекрасны, когда они выражают то, что вы хотите выразить.

Например, функция десериализации может возвращать List, но она не знает тип элемента списка. Таким образом, List является подходящим типом возврата.

7
задан BimmerM3 5 March 2014 в 10:00
поделиться

4 ответа

Вы близки, но измените цикл while, чтобы выглядеть следующим образом:

while (in.hasNextLine()) {
    Scanner lineIn = new Scanner(line);
    //The initial case - this first line is used to determine the size of the array
    if(lineIn.hasNext()) {
        //Create a String array by splitting by spaces
        String[] s = lineIn.nextLine().split(" ");
        //Reinitialize the array to hold all of your subarrays
        matrix = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            //Reinitialize each subarray to hold the numbers
            matrix[i] = new int[i];
            //Finally, parse your data from the String array
            matrix[0][i] = Integer.parseInt(s[i]);
        }
    }
    //Repeat the steps now that all of your arrays have been initialized
    for (int j = 1; j < matrix.length; j++) {
        String[] s = lineIn.nextLine().split(" ");
        for (int i = 0; i < s.length; i++) {
            matrix[j][i] = Integer.parseInt(s[i]);
        }
    }
}

Самое большое изменение, которое вы можете сделать, чтобы сделать это проще для себя, - это получить ваши номера в ряд -линия. С каждой строкой, которую вы получаете, легко разбить ее на массив строк, чтобы вы могли разобрать каждый номер отдельно. Сделав это таким образом, вы можете сразу получить всю длину массива без необходимости иметь неприятные счетчики.

1
ответ дан David Kopczyk 22 August 2018 в 02:32
поделиться
  • 1
    Я реализовал этот цикл, но я получаю «No Such Element & quot; ошибка в '.nextLine ()', и я не уверен, в какой именно точке она доходит до конца файла. – BimmerM3 5 March 2014 в 02:41

Сначала проверьте результаты сканирования. Я не думаю, что эти разделители будут работать. (BTW, метод nextInt() сканера удобен.)

Если вы можете предположить, что вход представляет собой квадратную матрицу, сканирование первой строки покажет, сколько целых чисел она содержит. Затем вы можете (повторно) выделить массивы. Затем обработайте все строки, включая первую строку, которую вы уже сканировали.

Затем вы можете установить matrix = new int[n][n];

0
ответ дан Jerry101 22 August 2018 в 02:32
поделиться

Я создал следующий 2D-массив из предоставленного вами файла:

 37 | 48 | 59 | 70 | 81 |  2 | 13 | 24 | 35
----+----+----+----+----+----+----+----+----
 36 | 38 | 49 | 60 | 71 | 73 |  3 | 14 | 25
----+----+----+----+----+----+----+----+----
 26 | 28 | 39 | 50 | 61 | 72 | 74 |  4 | 15
----+----+----+----+----+----+----+----+----
 16 | 27 | 29 | 40 | 51 | 62 | 64 | 75 |  5
----+----+----+----+----+----+----+----+----
  6 | 17 | 19 | 30 | 41 | 52 | 63 | 65 | 76
----+----+----+----+----+----+----+----+----
 77 |  7 | 18 | 20 | 31 | 42 | 53 | 55 | 66
----+----+----+----+----+----+----+----+----
 67 | 78 |  8 | 10 | 21 | 32 | 43 | 54 | 56
----+----+----+----+----+----+----+----+----
 57 | 68 | 79 |  9 | 11 | 22 | 33 | 44 | 46
----+----+----+----+----+----+----+----+----
 47 | 58 | 69 | 80 |  1 | 12 | 23 | 34 | 45

Массив определяет размер квадрата, когда он читает первую строку файла. Это очень динамично. Его работы до тех пор, пока входной файл является идеальным квадратом. У меня нет дополнительной обработки ошибок.

Вот простой подход, который должен придерживаться ваших рекомендаций.

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ReadMagicSquare {
    public static int[][] create2DIntMatrixFromFile(String filename) throws Exception {
        int[][] matrix = null;

        // If included in an Eclipse project.
        InputStream stream = ClassLoader.getSystemResourceAsStream(filename);
        BufferedReader buffer = new BufferedReader(new InputStreamReader(stream));

        // If in the same directory - Probably in your case...
        // Just comment out the 2 lines above this and uncomment the line
        // that follows.
        //BufferedReader buffer = new BufferedReader(new FileReader(filename));

        String line;
        int row = 0;
        int size = 0;

        while ((line = buffer.readLine()) != null) {
            String[] vals = line.trim().split("\\s+");

            // Lazy instantiation.
            if (matrix == null) {
                size = vals.length;
                matrix = new int[size][size];
            }

            for (int col = 0; col < size; col++) {
                matrix[row][col] = Integer.parseInt(vals[col]);
            }

            row++;
        }

        return matrix;
    }

    public static void printMatrix(int[][] matrix) {
        String str = "";
        int size = matrix.length;

        if (matrix != null) {
            for (int row = 0; row < size; row++) {
                str += " ";
                for (int col = 0; col < size; col++) {
                    str += String.format("%2d",  matrix[row][col]);
                    if (col < size - 1) {
                        str += " | ";
                    }
                }
                if (row < size - 1) {
                    str += "\n";
                    for (int col = 0; col < size; col++) {
                        for (int i = 0; i < 4; i++) {
                            str += "-";
                        }
                        if (col < size - 1) {
                            str += "+";
                        }
                    }
                    str += "\n";
                } else {
                    str += "\n";
                }
            }
        }

        System.out.println(str);
    }

    public static void main(String[] args) {
        int[][] matrix = null;

        try {
            matrix = create2DIntMatrixFromFile("square.txt");
        } catch (Exception e) {
            e.printStackTrace();
        }

        printMatrix(matrix);
    }
}

Этот подход более совершенен и оптимизирован.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ReadMagicSquare {

    private int[][] matrix;
    private int size = -1;
    private int log10 = 0;
    private String numberFormat;

    public ReadMagicSquare(String filename) {
        try {
            readFile(filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void readFile(String filename) throws IOException {
        // If included in an Eclipse project.
        InputStream stream = ClassLoader.getSystemResourceAsStream(filename);
        BufferedReader buffer = new BufferedReader(new InputStreamReader(stream));

        // If in the same directory - Probably in your case...
        // Just comment out the 2 lines above this and uncomment the line
        // that follows.
        //BufferedReader buffer = new BufferedReader(new FileReader(filename));

        String line;
        int row = 0;

        while ((line = buffer.readLine()) != null) {
            String[] vals = line.trim().split("\\s+");

            // Lazy instantiation.
            if (matrix == null) {
                size = vals.length;
                matrix = new int[size][size];
                log10 = (int) Math.floor(Math.log10(size * size)) + 1;
                numberFormat = String.format("%%%dd", log10);
            }

            for (int col = 0; col < size; col++) {
                matrix[row][col] = Integer.parseInt(vals[col]);
            }

            row++;
        }
    }

    @Override
    public String toString() {
        StringBuffer buff = new StringBuffer();

        if (matrix != null) {
            for (int row = 0; row < size; row++) {
                buff.append(" ");
                for (int col = 0; col < size; col++) {
                    buff.append(String.format(numberFormat,  matrix[row][col]));
                    if (col < size - 1) {
                        buff.append(" | ");
                    }
                }
                if (row < size - 1) {
                    buff.append("\n");
                    for (int col = 0; col < size; col++) {
                        for (int i = 0; i <= log10 + 1; i++) {
                            buff.append("-");
                        }
                        if (col < size - 1) {
                            buff.append("+");
                        }
                    }
                    buff.append("\n");
                } else {
                    buff.append("\n");
                }
            }
        }

        return buff.toString();
    }

    public static void main(String[] args) {
        ReadMagicSquare square = new ReadMagicSquare("square.txt");
        System.out.println(square.toString());
    }
}
6
ответ дан Mr. Polywhirl 22 August 2018 в 02:32
поделиться
  • 1
    Я ценю, что это действительно единственный ответ, который решает проблему, но мы никогда не были введены в буферы и еще должны писать классы с помощью вспомогательных методов. Я знаю, что это даст правильный ответ, но я думаю, что мне нужно, чтобы это было выполнено более примитивно. – BimmerM3 5 March 2014 в 03:29
  • 2
    что, если на входе больше столбцов (9), чем строк (1)? вы должны инициализировать матрицу с 1 строкой и 1 столбцом и, в конечном итоге, получить исключение arrayindexoutofbound. – Em Ae 5 March 2014 в 03:32
  • 3
    Вы читали, что я сказал? «Это очень динамично. Он работает до тех пор, пока входной файл является идеальным квадратом. У меня нет дополнительной обработки ошибок. & quot; – Mr. Polywhirl 5 March 2014 в 03:39
  • 4
    Я могу "тупой" если хотите ... Я сохраню свое первоначальное представление ниже «нового», ответ, когда закончим. – Mr. Polywhirl 5 March 2014 в 03:50
  • 5
    Это было бы очень признательно. Если бы мне не пришлось придерживаться такого базового кода, я бы не подумал, что у меня возникнет такая проблема. Я потратил столько времени на эту простую проблему, что мой мозг даже не попытался продолжить обдумывать ее. – BimmerM3 5 March 2014 в 03:57

С Java 8 и Потоки :

  static public int[][] create2DIntMatrixFromFile(Path path) throws IOException {
    return Files.lines(path)
      .map((l)->l.trim().split("\\s+"))
      .map((sa)->Stream.of(sa).mapToInt(Integer::parseInt).toArray())
      .toArray(int[][]::new);
  }

Это только для части «чтения» вопроса.

0
ответ дан YoYo 22 August 2018 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: