Из файла записать в массив

178
11 мая 2019, 15:50

Нужно записать значения из файла в массив. В файле все выглядит как таблица 5 на 3

1 2 3
5 4 3
2 3 4
2 1 3
5 3 3

Дальше нужно поменять первый столбец и последний местами. Код не работает, не совсем понятно как именно поменять столбцы в этом считанном массиве.

package lab10.pkg2;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Lab102 {
 private List<String> s;
   public Lab102() {
        this.s = new ArrayList<String>();
    }
    private List<String> readStringsFromFile(String nameFile) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
            String line = "";
            while ((line = reader.readLine()) != null) {
                s.add(line);
            }
            reader.close();
        } catch (IOException e) {
            System.out.println("Неможливо прочитати файл!");
        }
        return this.s;
    }
    private int[][] getArr(List<String> s) {
        int[] q = new int[5];  
        int i = s.size();
        int j = s.get(0).split(" ").length;
        int[][] arr = new int[i][j];
        for (int a = 0; a < s.size(); a++) {
            String[] arrayStringNumbers = s.get(a).split(" ");
            for (int b = 0; b < j; b++) {
                if (isNumeric(arrayStringNumbers[b])) {
                    arr[a][b] =  Integer.parseInt(arrayStringNumbers[b]);
                    System.out.print(arr[a][b] + " ");
         for (int x = 0; x < arr.length; x++, System.out.println()) {
         for (int y = 0; y < arr[i].length; y++) {
            System.out.print(arr[i][j] + " ");
         }
      }
      for (int x = 0; x < 5; x++) {
         q[i] = arr[i][0];
      }
      for (int x = 0; x < arr.length; x++) {
         arr[i][0] = arr[i][2];
      }
      for (int x = 0; x < 5; x++) {
         arr[i][2] = q[i];
      }
      System.out.println(" ");
      for (int x = 0; x < q.length; x++) {
         System.out.print(q[i] + " ");
      }
      System.out.println(" ");
      System.out.println("Змінена матриця");
      System.out.println(" ");
      for (int x = 0; x < arr.length; x++) {
         arr[i][2] = q[x];
      }
      for (int x = 0; x < arr.length; x++, System.out.println()) {
         for (int y = 0; y < arr[i].length; y++) {
            System.out.print(arr[i][j] + " ");
         } 
      }
    for (int x = 0; x < arr.length; x++) {
        for (int y = 0; y < arr[i].length; y++) {
        }
    }
                }        
            }
            System.out.println();
        }
        return arr;
    }
    public static boolean isNumeric(String string) {
        return string.matches("[-+]?\\d*\\.?\\d+");  
    }
    public static void main(String[] args) throws IOException {
      Lab102 l102 = new Lab102();
        List<String> s = l102.readStringsFromFile("input.txt");
        l102.getArr(s);
    }
    }
Answer 1

Я улучшил немного твой файл, разделил его на методы в зависимости от выполняемых действий, сократил код и конечно же избавился от ошибки.

Немного "фич", которые я добавил и объяснения:

  1. Есть короткая строчка перевода из String в int, из double в String, и т.д. если из числа в строку - String.valueOf(число), а если из String в число - Integer.parseInt(строка), Double.parseDouble(строка) и т.д.

  2. Используй по полнойfor для обычных массивов! (ну и необычных тоже) Чтобы поменять местами колонки, мне было достаточно вызвать колонку (см. reverseTable() метод), взять число левого столбца массива (array[i][0]) и присвоить его некоторой временной переменной temp, потом взять число правого столбца массива (array[i][column-1]) и присовить его первому числу (array[i][0]), а потом правому числу присвоить temp, что является числом левого столбца и вот так происходит обмен)))

  3. Ошибка была, я уверен, в for-loop, потому что это типичная ошибка при таких операциях с массивами.
  4. Я не стал исправлять s, но переменные/массивы/классы/методы называть понятным тебе и всем именем, а то запутаешься)
  5. То, что я закомментировал - можно удалить. Это не скажется на программе. Просто для тебя я оставил промежуточные заметки о коде :)

P.S. Украинский не знаю, поэтому комментарии на русском

Вот код:

package lab10.pkg2;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Lab102{
    private ArrayList<String> s = new ArrayList<>();
    private int row, column;
    private int[][] array;
    public static void main(String[] args) {
        Lab102 lab102 = new Lab102();
        lab102.readingDataInFile("test.txt");
        lab102.getArray();
        lab102.reverseTable();
        lab102.printArray();
    }
    private void readingDataInFile (String filename) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(filename));
            String line = "";
            while ((line = reader.readLine()) != null) {
                s.add(line);
            }
            row = s.size(); /* подсчитываю кол-во строк */
            column = s.get(0).split(" ").length; /* подсчитываю кол-во колонок */      
//            System.out.println("rows = " + row + " columns = " + column); /* проверка кол-ва строк и колонок */
            array = new int[row][column];
            reader.close();
        } catch (IOException e) {
            System.out.println("Неможливо прочитати файл!");
        }
    }
    //переводим массив из ArrayList в обычный array
    private void getArray() {
        String[] locArray;
        for(int i = 0; i < s.size(); i++) {
            locArray = s.get(i).split(" ");
            for (int j = 0; j < locArray.length; j++ ) {
                array[i][j] = Integer.valueOf(locArray[j]);
            }
        }
        //Проверка, что массив записан правильно
//      printArray();
    }
    //меняем последний столбец с первым
    private void reverseTable() {
        int temp;
        for(int i = 0; i < row; i++) {
            temp = array[i][0];
            array[i][0] = array[i][column-1];
            array[i][column-1] = temp;
        }
    }
    //печатаем массив
    private void printArray() {
        System.out.println("Первоначальный массив:");
        for(int i = 0; i < s.size(); i++) {
            System.out.println(s.get(i));
        }
        System.out.println();
        System.out.println("Итоговый массив:");
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < column; j++) {
                System.out.print(array[i][j] + " ");
            }
        System.out.println();
        }
    }
}
READ ALSO
Нормально ли с точки зрения хорошей архитектуры иметь метод на 50-60+ строк? [закрыт]

Нормально ли с точки зрения хорошей архитектуры иметь метод на 50-60+ строк? [закрыт]

Есть метод, на вход которого приходит список Json - строкИз них нужно распарсить данные, преобразовать их к рабочему виду и склеить в один текст,...

143
Неверно выводит таблицы с данными

Неверно выводит таблицы с данными

Столкнулся с проблемой, есть база данных с заказами пользователейЕсть метод, который согласно User id вытягивает заказы именно этого юзера

166
Парсер не переходит на другую страницу

Парсер не переходит на другую страницу

Пишу парсер, учусь, вот код:

161
Как передать @ConfigurationProperties в сервис?

Как передать @ConfigurationProperties в сервис?

Имеется класс конфига:

123