Получение целочисленных значений в массив из файла - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь получить целочисленные значения через запятую из файла и помещаю их в двумерный массив. Файл выглядит так:

0,7,9,0,0,14
7,0,10,15,0,0
9,10,0,11,0,2
0,15,11,0,6,0
0,0,0,6,0,9
14,0,2,0,9,0

, поэтому я хочу, чтобы первая строка была в массиве [0] [от 0 до 5] и то же самое для других строк, например, массив [2] [1] должен быть 10. Но я не могу понять алгоритм 2d массива здесь вообще.

public static void main(String[] args) throws FileNotFoundException {
    BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
    Scanner sc = new Scanner(reader);
    int[][] array = new int[6][6];

    while(sc.hasNextLine()){
        String line = sc.nextLine();
        String[] str = line.split(",");

        for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 6; j++) {
                    array[i][j] = Integer.valueOf(str[i]);
                }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 22 апреля 2020

Вы можете сделать это так. Ключевым моментом является то, что в Java нет реальных многомерных массивов. Просто одиночные D-массивы, которые также могут содержать массивы.

        // allocate the "2D" array but no need to specify the rows.
        int[][] array = new int[6][];

        // starting row number
        int rowNumber = 0;

        while(sc.hasNextLine()){
            String line = sc.nextLine();
            System.out.println(line);
            String[] str = line.split(",");

            // here is where your code differs
            // allocate a new row based on length of items just read
            int[] row = new int[str.length];

            // Now copy and convert to ints.
            for (int i = 0; i < str.length; i++) {
                row[i] = Integer.parseInt(str[i]);
            }
            // Then just assign the row to the row number.
            // you can do this because a two dimentional array is just an
            // one dimenional array of another one dimensional array.
            array[rowNumber++] = row;
        }
        // print them out for verification.
        // get each row (from the array of rows)
        for (int[] row : array) {
            System.out.println(Arrays.toString(row));
        }

Итак, что было похоже на следующее:

int [][] matrix = new int[2][];
matrix[0] = new int[]{1,2,3,4};
// rows can be different sizes.
matrix[1] = new int[]{1,2,3,4,5,6,7};      

for (int i = 0; i <2; i++) {
   int[] row  = matrix[i];
   for (int j = 0; j < row.length; j++) {
        System.out.print(row[j] + " " );
   }
   System.out.println(); // next line
} 

0 голосов
/ 22 апреля 2020

Вот более современный способ сделать это, используя NIO и Streams :

int[][] read2dArrayFromFile(String path) throws IOException {
    return Files.readAllLines(Paths.get(path))
                .stream()
                .map(line ->
                         Arrays.stream(
                             line.split("\\D+")  // split by anything that's not a digit
                         ).mapToInt(Integer::parseInt).toArray()
                ).toArray(int[][]::new);
}
0 голосов
/ 22 апреля 2020

Вы просматриваете каждое значение для каждой строки. Один из ваших индексов должен быть линией, а другой - позицией в пределах линии. Вам нужен только один for цикл; Вы должны увеличивать другой индекс как часть вашего, в то время как l oop.

public static void main(String[] args) throws FileNotFoundException {
    BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
    Scanner sc = new Scanner(reader);
    int[][] array = new int[6][6];
    int i=0;
    while(sc.hasNextLine()){
        String line = sc.nextLine();
        String[] str = line.split(",");
        for (int j = 0; j < 6; j++) {
            array[i][j] = Integer.valueOf(str[j]);
        }
        i++;
    }
}

Вы также должны учитывать, что если файл имеет более 6 строк или более 6 строк, это не удастся, так что не очень надежный код Возможно, вам лучше заполнить другой (динамический c) тип данных и преобразовать его в массив, как только вы закончите чтение файла. Как минимум, вы должны убедиться, что вы не превышаете ожидаемый диапазон индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...