Ява читать текстовый файл (2D) в несколько 2D массив - PullRequest
0 голосов
/ 05 мая 2018

У меня есть текстовый файл, который содержит такие данные:

HW1  HW2  HW3  HW4  HW5
97   64   75   100  21   John
19   68   89   49   97   Kim
28   83   48   44   91   Kathy
69   66   78   87   85   Steve
99   94   93   96   91   Stacy
35   75   65   55   45   Faith

Я попытался прочитать размер с помощью BufferedReader, чтобы я мог преобразовать их в несколько массивов (т. Е. HW1arr, HW2arr и т. Д.). Как я могу найти размер массива как этот 2D файл?

public static void main(String[] args) {

    Scanner reader = null;
    try {
        File f = new File("inputHW7.txt");
         reader = new Scanner(f);
    } catch(FileNotFoundException e) {
    }


    double[][] size2d = null;
    int count = 0;
    int rowCount =0;
    int colCount = 0;
    int readChar = 0;
    boolean empty = true;

    rowCount = reader.nextInt();
    for(int i=0 ; i<rowCount ; i++){
        colCount = reader.nextInt();
        size2d[i] = new double[colCount];
        System.out.print("debugs column = "+size2d[i]);
        for(int j=0 ; j<colCount ; j++){
            size2d[i][j] = reader.nextDouble();
            System.out.println("debug rows = "+ size2d[i][j]);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вот концепция. Я не буду делать за тебя домашнее задание.

  1. Заполнить ArrayList типа String всеми строками файла (исключая пустые строки, если таковые имеются). Обязательно закрыть чтение файла когда закончите с файлом. List<String> list = new ArrayList<>();. Вам нужно будет использовать метод List.add () , чтобы добавить в список все необходимые строки данных файла.
  2. ArrayList size (list.size()) теперь показывает, как долго ( length ) должен быть каждый массив, который вы хотите создать. Объявите каждый из ваших Массивы столбцов (то есть: hw1Array [] до hw5Array [] ) как double data тип. Глядя на ваш код, это ваше намерение в любом случае. Быть уверенным чтобы сразу же инициализировать длину каждого массива: double[] hw1Array = new double[list.size()];.
  3. Поскольку столбец имен следует игнорировать, мы не будем об этом беспокоиться.
  4. Теперь создайте цикл для , чтобы выполнить итерацию по списку , который вы созданный чтением файла данных. Используйте i в качестве переменной итерации. for (int i = 0; i < list.size(); i++) { }.
  5. В цикле for объявите строковый массив и используйте String.split () метод для каждого элемента списка: String[] lineValues = list.get(i).split("\\s+");. "\\s+" - это регулярное выражение в методе split () , которое означает разделение строки на разделитель, содержащий любое количество пробелов.
  6. Теперь это всего лишь вопрос заполнения ваших 5 столбчатых массивов. Снова в вашем цикле для заполните каждый столбчатый массив данными из lineValues ​​[] String Array, созданный в предыдущей строке кода и выполняющий преобразование в тип данных double в процессе, используя метод Double.parseDouble () , для пример: if (lineValue.length >= 1) { hw1Array[i] = Double.parseDouble(lineValue[0]); } if (lineValue.length >= 2) { hw2Array[i] = Double.parseDouble(lineValue[1]); } if (lineValue.length >= 3) { hw3Array[i] = Double.parseDouble(lineValue[2]); } if (lineValue.length >= 4) { hw4Array[i] = Double.parseDouble(lineValue[3]); } if (lineValue.length >= 5) { hw5Array[i] = Double.parseDouble(lineValue[4]); }

    Мы используем условие if , чтобы гарантировать, что на самом деле есть данные для анализа, чтобы удвоиться, в противном случае мы получим NumberFormatException .

Вы создали массивы.

Для быстрого отображения ваших массивов:

System.out.println(Arrays.toString(hw1Array));
System.out.println(Arrays.toString(hw2Array));
System.out.println(Arrays.toString(hw3Array));
System.out.println(Arrays.toString(hw4Array));
System.out.println(Arrays.toString(hw5Array));
0 голосов
/ 06 мая 2018
  • Сканер предоставляет API-интерфейсы для проверки наличия другого элемента во входном потоке (даже определенного типа)
  • hasNext * семейство API и следующее * семейство API - это то, что вам нужно.
  • Используйте это с петлей.
  • Используйте ArrayList, чтобы вам не нужно было знать размер заранее.

  • если число столбцов фиксировано, вы можете прочитать всю строку и разделить ее пробелом. Длина полученного массива будет вашим размером столбца. Однако размер строки не может быть получен заранее. Следовательно, список коллекции должен быть предпочтительным.

https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Scanner.html

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