Используя класс моего компьютера для моего класса компьютера в последнем проекте, я должен написать программу на 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
Мне нужна помощь при создании массива при чтении файла
Ошибка, которую вы получаете, заключается в том, что в вашем 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]) ;
}
}
У вас уже есть класс Computer
(тот, с которым вы связались), который может содержать все эти свойства для данного "компьютера".
Вы знаете, что каждая строка в вашем файле представляет собой отдельный компьютер. Поэтому каждая строка может быть представлена Computer
(тот, с которым вы связались).
Вы знаете, как разбирать эти строки в массиве строк с помощью split()
, и каждый элемент в этом разделенном массиве точно соответствует одному из свойств "компьютера". Это означает, что каждая строка файла может создавать String[]
где каждый элемент этой String[]
представляет одно из свойств компьютера (например, производитель compArray[0]
, модель compArray[1]
и т.д.).
Вы также знаете, что у вас уже есть динамические массивы, такие как ArrayList<Computer>
.
Теперь это всего лишь вопрос об этом:
Computer
и скопируйте разделенные маркеры в соответствующие свойства.Computer
в свой динамический List<Computer>
.Не забудьте обработать ошибки изящно: что произойдет, если вы нажмете пустую строку или строку без ожидаемого количества токенов?
У вас есть все необходимые инструменты, поэтому подумайте о том, как их собрать вместе, чтобы решить проблему.