Разбор данных из текстового файла в несколько массивов в Java - PullRequest
2 голосов
/ 27 сентября 2011

Позвольте мне начать с того, что я довольно новичок в Java, поэтому прости меня, если я делаю очевидные ошибки ...

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

Текстовый файл содержит данные в этом формате (хотя при необходимости его можно слегка изменить, чтобы иметь теги-идентификаторы, если это единственный способ)

noOfStudents
studentNAme studentID numberOfCourses
CourseName CourseNumber creditHours оценка
CourseName CourseNumber creditHours оценка
CourseName CourseNumber creditHours оценка
.
.
studentNAme studentID numberOfCourses
название курса CourseNumber creditHours оценка
название курса CourseNumber creditHours оценка * 1016CourseName CourseNumber creditHours оценка
.
.

В первой строке указано общее количество «студентов», которые будут перечислены и должны быть перемещены в массивы.Один массив будет содержать информацию об ученике, поэтому
studentName, studentID, numberOfCourses
для одного массива и
courseName, courseNumber, creditHours, класс
для второго массива.

Моя проблемавытекает из того, как анализировать эти данные.
В настоящее время я читаю в первой строке, преобразовываю в int и использую это для определения размера моего студенческого массива.После этого я не знаю, как переместить данные в массивы, и моя программа знает, в какой массив перемещать какие строки.

Следует отметить, что количество курсов, которые посещает каждый студент, является переменным, поэтому я не могу просто прочитать 1 строку в одном массиве, затем 3 строки в следующем и т. Д.

WillМне нужно использовать идентификаторы или я упускаю что-то очевидное?Я смотрю на эту проблему уже неделю, и в этот момент я просто расстраиваюсь.

Любая помощь очень ценится!спасибо

edit: Вот код, над которым я сейчас работаю.

public static void main(String args[])
  {
  try{
  // Open the file
  FileInputStream fstream = new FileInputStream("a1.txt");
  // Get the object of DataInputStream
  DataInputStream in = new DataInputStream(fstream);
  BufferedReader br = new BufferedReader(new InputStreamReader(in));

  String strLine; // temporarily holds the characters from the current line being read
  String firstLine; // String to hold first line which is number of students total in     file.

  // Read firstLine, remove the , character, and convert the string to int value. 
  firstLine = br.readLine();
  firstLine = firstLine.replaceAll(", ", "");
  int regStudnt = Integer.parseInt(firstLine);
  // Just to test that number is being read correctly.
  System.out.println(regStudnt + " Number of students\n");

  // 2D array to hold student information
  String[][] students;
  // Array is initialized large enough to hold every student with 3 entries per student. 
  // Entries will be studentName, studentID, numberOfCourses
  students = new String[3][regStudnt];


  //Read File Line By Line
  while ((strLine = br.readLine()) != null)   {
      // Split each line into separate array entries via .split at indicator character.
      // temporary Array for this is named strArr and is rewriten over after every line   read.
      String[] strArr;
      strArr = strLine.split(", ");
  }

  //Close the input stream
  in.close();
    }catch (Exception e){//Catch exception if any
  System.err.println("Error: " + e.getMessage());
  }
  }

Я надеюсь, что это поможет кому-то вести меня в правильном направлении.

Я думаю, что главная проблема, с которой я столкнулся с этой точки зрения, - это найти способ зацикливания таким образом, чтобыинформация об ученике читается в массиве учеников, затем информация о курсе в соответствующем месте массива курсов, а затем снова начинается с нового ученика, пока все ученики не будут прочитаны.

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Попробуйте этот сегмент кода, я думаю, что он точно соответствует вашим требованиям.Если у вас есть путаница, дайте мне знать!

class course {

        String name;
        int number;
        int credit;
        String grade;
    }

    class student {

        String name;
        String id;
        int numberCourses;
        course[] courses;
    }

    class ParseStore {

        student[] students;

        void initStudent(int len) {
            for (int i = 0; i < len; i++) {
                students[i] = new student();
            }
        }

        void initCourse(int index, int len) {
            for (int i = 0; i < len; i++) {
                students[index].courses[i] = new course();
            }
        }

        void parseFile() throws FileNotFoundException, IOException {
            FileInputStream fstream = new FileInputStream("test.txt");
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));

            int numberStudent = Integer.parseInt(br.readLine());
            students = new student[numberStudent];
            initStudent(numberStudent);

            for (int i = 0; i < numberStudent; i++) {

                String line = br.readLine();
                int numberCourse = Integer.parseInt(line.split(" ")[2]);
                students[i].name = line.split(" ")[0];
                students[i].id = line.split(" ")[1];
                students[i].numberCourses = numberCourse;
                students[i].courses = new course[numberCourse];
                initCourse(i, numberCourse);

                for (int j = 0; j < numberCourse; j++) {
                    line = br.readLine();
                    students[i].courses[j].name = line.split(" ")[0];
                    students[i].courses[j].number = Integer.parseInt(line.split(" ")[1]);
                    students[i].courses[j].credit = Integer.parseInt(line.split(" ")[2]);
                    students[i].courses[j].grade = line.split(" ")[3];
                }
            }                        
        }
    }

Вы можете проверить это, напечатав содержимое массива students после выполнения ParseStore

0 голосов
/ 27 сентября 2011

Вот некоторый псевдокод, который должен помочь вам:

Student[] readFile() {
  int noOfStudents = ...;
  Student[] students = new Student[noOfStudents];

  for (int i = 0; i < noOfStudents; ++i) {
    students[i] = readStudent();
  }

  return students;
}

Student readStudent() {
  int numberOfCourses = ...;
  String name = ...;
  String id = ...;

  Course[] courses = new Course[numberOfCourses]

  for (int i = 0; i < numberOfCourses; ++i) {
    courses[i] = readCourse();
  }

  return new Student(id, name, courses);
}
0 голосов
/ 27 сентября 2011

Наличие идентификатора (может быть пустой строкой) того, когда новый студент начинает, облегчает задачу, как вы могли бы просто сделать

if("yourIdentifier".equals(yourReadLine))
    <your code for starting a new student>
...