我有一个文本文件,但是我只需要打印文件的某些方面

时间:2018-11-06 15:52:05

标签: java

我有一个基本上类似于学生成绩单的文本文件,但我只需要打印学生,课程编号,然后按以下格式打印课程:

学生A:课程数

  • 课程标题1

  • 课程标题2

  • 等。

学生B:课程数

  • 课程标题1

  • 课程标题2

  • 等。

C学生:课程数

  • 课程标题1

  • 课程标题2

  • 等。

这是文本文件的一部分:

学生A,成绩,学分

计算机应用程序,A,1

职业调查第一,A,1阶段

英语9,A,1

世界历史II,A,1

地球科学,A,1

西班牙语I,A,1

第I,A,1条

健康与体育9,B,1

计算机信息系统,A,1

英语10荣誉,A,1

几何,B,1

世界历史I,A,1

生物学,A,1

西班牙语II,A,1

第二条,A,1

健康与体育10,B,1

“设计,多媒体和Web技术”,C,1

弗吉尼亚州和美国历史,A,1

代数II,A,1

化学I,A,1

西班牙语III,A,1

创业教育,A,1

高级创业教育,A,1

荣誉英语12,A,1

经济和个人理财,A,1

AP英语语言和作文,A,1

美联社政府与政治:US,A,1

数学分析/微积分,A,1

物理I,A,1

A,1时装职业介绍

烹饪艺术概论,A,1

职业解释-第二阶段,A,1

到目前为止,我的代码仅打印整个文件。我试过使用system.out.println() 在其他地方,但没有任何效果。这是我目前的代码。

import java.io.*;
import java.util.*;
import java.util.Scanner;
public class Phase1 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws FileNotFoundException {
    // TODO code application logic here
    Scanner file = new Scanner(new 
    FileReader("C:\\Users\\coderva.org\\Downloads\\FakeData.csv"));
    ArrayList<Student> students = new ArrayList<Student>();

    while(file.hasNextLine())
    {
        String line = file.nextLine();
        String[] lines = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");

        System.out.println(line);
    }  
}

class Course
{
private char grade;
private double credit;
private String title;

public Course()
{
    title = "";
    grade = 'I';
    credit = 0;
}

public Course(String title, char grade, double credit)
{
    this.title= title;
    this.grade = grade; 
    this.credit = credit; 
}

public String getTitle()
{
    return title;
}
public char getGrade()
{
    return grade;
}

public double getCredit()
{
    return credit;
}

public String toString()
{
    return title + " " + grade + " " + credit;
}
}

class  Student
{
private String name;
private ArrayList<Course> courses;
public Student()
{

    name = null;
    courses = null;
}

public Student(String name, ArrayList<Course> courses)
{
    this.name = name;
    this.courses = courses;
}

public void setName(String name) 
{
    this.name = name;
}

public void setCourses(ArrayList<Course> courses) 
{
    this.courses = courses;
}

public String getName() 
{
    return name;
}

public ArrayList<Course> getCourses() 
{
    return courses;
}
}
}

1 个答案:

答案 0 :(得分:0)

好的,因此在您的代码中,您创建了一个名为Phase1的主类,一个名为Course的课程类以及一个名为Student的学生类。创建这些类的想法是正确的。基本上,在您的主类中,您想遍历输入文件的每一行并解析其内容。您需要确定输入文件的行是新学生还是将添加到当前学生的课程。如果该行包含一个新学生,则需要使用您的Student类创建一个新的学生对象。否则,您需要使用课程课程来添加新课程,以添加到学生的课程列表中。解析完整个文件后,您就可以遍历学生列表以及每个学生所拥有的课程列表。

第1阶段的课程:

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

public class Phase1 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner file = new Scanner(new FileReader("data.txt"));
        ArrayList<Student> students = new ArrayList<Student>();
        int currStudent = -1;

        while(file.hasNextLine()) {
            String line = file.nextLine();
            String[] split = new String[3];

            //Parse the line input, check if a course name has a comma (it has a comma if it is in quotation marks), otherwise proceed normally
            if(line.indexOf('"') == -1) {
                split = line.split(",");
            } else {
                split[0] = line.substring(line.indexOf('"')+1, line.lastIndexOf('"'));
                split[1] = line.substring(line.lastIndexOf('"')+2, line.lastIndexOf(','));
                split[2] = line.substring(line.lastIndexOf(',')+1,line.length());
            }

            //If the line contains a new student, create the student
            if(split[0].contains("Student")) {
                students.add(new Student(split[0],new ArrayList<Course>()));
                currStudent++;
                continue;
            }

            //Add course to the current student
            students.get(currStudent).addCourse(split[0], split[1].charAt(0), Double.parseDouble(split[2]));
        }

        //Print all students
        for(Student s : students) {
            System.out.println(s.getName() + ": " + s.getCourses().size());
            //Print all courses for each student
            for(Course c : s.getCourses()) {
                System.out.println(c.getTitle());
            }
            System.out.println();
        }

        file.close();
    }
}

课程(与上述课程相同)

public class Course
{
    private char grade;
    private double credit;
    private String title;

    public Course() {
        title = "";
        grade = 'I';
        credit = 0;
    }

    public Course(String title, char grade, double credit) {
        this.title= title;
        this.grade = grade; 
        this.credit = credit; 
    }

    public String getTitle() {
        return title;
    }
    public char getGrade() {
        return grade;
    }

    public double getCredit() {
        return credit;
    }

    public String toString() {
        return title + " " + grade + " " + credit;
    }
}

学生类(稍作修改-将setCourses更改为addCourse):

import java.util.*;

public class Student {
    private String name;
    private ArrayList<Course> courses;

    public Student() {

        name = null;
        courses = null;
    }

    public Student(String name, ArrayList<Course> courses) {
        this.name = name;
        this.courses = courses;
    }

    public void setName(String name)  {
        this.name = name;
    }

    public void addCourse(String title, char grade, double credit) {
        this.courses.add(new Course(title,grade,credit));
    }

    public String getName() {
        return name;
    }

    public ArrayList<Course> getCourses() {
        return courses;
    }
}

如果您对理解代码有任何疑问,请告诉我!