Создать массив объекта, когда сканер читает текстовый файл

1

Используя класс моего компьютера для моего класса компьютера в последнем проекте, я должен написать программу на Java, которая читает файл с именем компьютерных данных computer.txt и создает массив объектов компьютеров, и до сих пор у меня это есть.

package project5;
import java.util.Scanner;
import java.io.*;


public class Project5 {


public static void main(String[] args){

    String[][] compArray = new String[50][50];
    String line = ":";
    String [] temp;

    Scanner file =null;
    try 
    {
     file = new Scanner(new File("computers.txt"));
    }
    catch(FileNotFoundException e)
    {
        System.out.println("Could not open file " + "computers.txt");
        System.exit(200);
    }

    int i = 0;
    while ((line = file.nextLine())!= null){ 
        temp = line.split(":"); 
        for (int j = 0; j<compArray[i].length; j++) {    
            compArray[i][j] = temp[j];
        }
        i++;
    }

    System.out.println(compArray[0][0]);
    }

}

Теперь я получаю сообщение об ошибке. я сделал

System.out.println(compArray[0][0]);

чтобы увидеть, работает ли он, но я получил эту ошибку

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at project5.Project5.main(Project5.java:44)

файл computer.txt выглядит так:

Dell Computers Inc.:Inspiron 15 Touch:6:500:Intel Core i5:CD/DVD+-RW:Windows 8.1:649.99
Dell Computers Inc.:Inspiron 17:4:500:Intel Core i3:CD/DVD+-RW:Windows 7:549.99
Dell Computers Inc.:Alienware 18:16:1000:Intel Core i7:Dual Layer Blu-ray:Windows    7:2999.99
Acer Computers Inc.:Aspire AT3-600:6:2000:Intel Core i5:BlueRay:Windows 8:599.99

Мне нужна помощь при создании массива при чтении файла

Теги:
java.util.scanner
text-files

2 ответа

0

Ошибка, которую вы получаете, заключается в том, что в вашем for-loop вы повторяете 50 раз каждый раз, это означает, что j будет увеличиваться до 50 к концу цикла. Теперь проблема заключается в строке кода, где вы используете temp [j]. Поскольку temp будет содержать массив строк, возвращаемых методом split(), на основе вашего файла computer.txt и вашего разделителя регулярных выражений, который является двоеточием ":", temp будет содержать массив размером 8, а когда j переменная увеличивается до 8 вы получите ArrayIndexOutOfBoundsException: 8, так как temp не достаточно большой, другими словами, temp не имеет индекса 8 или выше.

compArray[i][j] = temp[j]; // here is the problem.

Попробуйте это

package project5;
import java.util.Scanner;
import java.io.*;


public class Project5 {
    public static void main(String[] args){

        String[][] compArray = new String[50][];// instead of new String[50][50]
        String line = ":";
        String [] temp;

        Scanner file =null;
        try 
        {
            file = new Scanner(new File("computers.txt"));
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Could not open file " + "computers.txt");
            System.exit(200);
        }

        int i = 0;
        while ( file.hasNext() ){ 
            line = file.nextLine() ;
            temp = line.split(":"); 
            compArray[i] = temp ; // Since you have an array of arrays you can put the return of your split method directly in your array
            i++;
        }

        System.out.println(compArray[0][0]) ;

        System.out.println(compArray[0][7]) ;
    }
}
0

У вас уже есть класс Computer (тот, с которым вы связались), который может содержать все эти свойства для данного "компьютера".

Вы знаете, что каждая строка в вашем файле представляет собой отдельный компьютер. Поэтому каждая строка может быть представлена Computer (тот, с которым вы связались).

Вы знаете, как разбирать эти строки в массиве строк с помощью split(), и каждый элемент в этом разделенном массиве точно соответствует одному из свойств "компьютера". Это означает, что каждая строка файла может создавать String[] где каждый элемент этой String[] представляет одно из свойств компьютера (например, производитель compArray[0], модель compArray[1] и т.д.).

Вы также знаете, что у вас уже есть динамические массивы, такие как ArrayList<Computer>.

Теперь это всего лишь вопрос об этом:

  1. Прочитайте каждую строку из файла. Для каждой строки:
  2. Разделите его, как вы уже делаете.
  3. Постройте новый Computer и скопируйте разделенные маркеры в соответствующие свойства.
  4. Добавьте этот Computer в свой динамический List<Computer>.

Не забудьте обработать ошибки изящно: что произойдет, если вы нажмете пустую строку или строку без ожидаемого количества токенов?

У вас есть все необходимые инструменты, поэтому подумайте о том, как их собрать вместе, чтобы решить проблему.

  • 0
    В дополнение к этому, класс драйвера (класс с main) должен иметь другое имя. Компьютерный класс будет просто классом bean (класс со свойствами). Как упоминал Джейсон, сначала придумайте модель, визуализируйте последовательность шагов и код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню