【问题标题】:Writing Class Hierarchy objects list onto a text file?将类层次结构对象列表写入文本文件?
【发布时间】:2021-04-12 20:57:58
【问题描述】:

我正在做一个班级分配,我必须参加一个我已经制作的程序,该程序由层次结构中的多个类和一个“演示”类组成,该类根据每个对象的信息组成进行打印。现在我需要对其进行更改,以便不必在控制台上打印出来,而是必须将其打印到一个文本文件中,用户输入文本文件名。这是“演示”主类的编码:

import java.lang.*;
import java.io.*;
import java.util.*;
/**
 * PolymorphDemo
 *
 * @author (Sean Hall)
 * @version (4/12/21)
 */
public class PolymorphDemo
{
    public static void main(String[] args) throws Exception
    {
        Person[] people = new Person[12];
        people[0] = new Student("Cotty, Manny", 4910);
        people[1] = new Undergraduate("Kick, Anita", 9931, 1);
        people[2] = new Undergraduate("DeBanque, Robin", 8812, 4);
        people[3] = new Person("Bugg, June");
        people[4] = new Parent("DeBanque, Sylvia", 1849);
        people[5] = new Alumni("McCombs, Daniel", 1542, "Pi Kappa Alpha");
        people[6] = new StudentGovernment("Steele, Ashley", 7025, "Class President");
        people[7] = new Employee("Jones, Jason", 150, "English");
        people[8] = new Faculty("Greene, Erin", 124, "Math", "Professor of Calculus");
        people[9] = new Staff("McKinley, Aaron", 86, "Maintenance", 14);
        people[10] = new Person("Honda, Edward");
        people[11] = new Undergraduate("Huginkiss, Amanda", 8230, 2);
           
        //Scanner for user input
        Scanner keyboard = new Scanner(System.in);
            
        //prepare the output file
        System.out.print("Enter the name of the new File: ");
        String outputFileName = keyboard.nextLine();
            
        try (PrintWriter output = new PrintWriter(new File(outputFileName)))
        {
            for (Person p : people)
            {
                output.println(p);
                output.println();
            }
        }
    }
}

我知道它还没有完成,但我已经完成了编程。多个类层次结构都链接到 person 对象,每个对象都有与其相关的特定信息。任何人都对如何将信息复制到保持这样的输出格式的文本文件有一些指示?

姓名:科蒂·曼尼
学号:4910

姓名:Kick,安妮塔
学号:9931

姓名:德班克、罗宾
学号:8812

姓名:布格,六月

姓名:西尔维娅·德班克
家庭号码:1849

姓名:麦库姆斯,丹尼尔
家庭号码:1542
校友联谊会/联谊会:Pi Kappa Alpha

姓名:斯蒂尔,阿什利
学号:7025
学生自治会头衔:班长

姓名:琼斯,杰森
员工编号:150
员工部门:英文

姓名:格林,艾琳
员工编号:124
员工部门:数学
教员职称:微积分教授

姓名:麦金利、亚伦
员工编号:86
员工部门:维修
员工薪资等级:14

姓名:本田,爱德华

姓名:哈金基斯,阿曼达
学号:8230
学生等级:1

我应该提到,这些链接在一起的每个班级在他们的班级中都有一种打印每个人/学生/本科生/等信息的方法。有,也许有某种方法可以根据类打印输出中的内容打印出信息?

【问题讨论】:

  • 你真的需要为people数组中的每个人创建一个键盘扫描器和一个新的输出文件吗?您将如何将至少Person 数据打印到文件中?
  • 仅供参考,“多重继承”的概念是模棱两可的,通常是指一个,它可以多个继承行为父类。 C++ 有这个,但 Java 没有。在Java 中,您可以从一个类(父类)继承行为,也可以从多个接口(不提供行为)继承。 (其中“行为”表示方法body。)因此请考虑这一点,并可能编辑您的问题以准确说出“多重继承对象”的含义。 (例如,您的意思是“从某个类继承的多个对象”?还是层次结构中的多个 ?)
  • 我并没有考虑为数组中的每个人创建一个新的输出文件,我想要一个文本文件中所有人员条目的列表。

标签: java text-files virtual-functions


【解决方案1】:

在类Person中实现一个方法以提供该类的字符串表示,例如它可以是一个标准方法toString,继承自Object类,便于打印Person及其子类:

// class Person
@Override
public String toString() {
    return "Name: " + this.name;
}

然后在子类中重写此实现并附加相关细节调用父类的实现super.toString()

// class Student extends Person
@Override
public String toString() {
    return String.format("%s%nStudent Number: %d", super.toString(), this.studentNumber);
}

Undergraduate 可以扩展Student,但它不需要覆盖toString 的实现,并且可以重用Student 的实现。

StudentGovernment 也可以扩展Student,但它必须覆盖其toString 以添加有关标题的信息:

// class StudentGovernment extends Student
@Override
public String toString() {
    return String.format("%s%nStudent Government Title: %s", super.toString(), this.title);
}

Person 的所有子类依此类推。


打印到文件应该使用try-with-resources来实现,以保证写入器正确关闭。

此外,需要修改逻辑以读取文件名并创建一次写入器(不是针对输入数组中的每个人):

// Scanner for user input
Scanner keyboard = new Scanner(System.in);

// prepare the output file
System.out.print("Enter the name of the new File: ");
String outputFileName = keyboard.nextLine();

try (PrintWriter output = new PrintWriter(new File(outputFileName))) {
    for (Person p : people) {
       output.println(p);
       output.println(); // empty line separating the data of persons
    }
}

【讨论】:

  • 你让我向前跳了一堆,但现在打印出来的文本文件是一团糟。给出的示例(而不是姓名:Cotty, Manny 学生编号:4910) Student@4640e87
  • 您能否提供您的实际代码如何在Student 中覆盖toString,以及它是否正确扩展了Person 类?
猜你喜欢
  • 2017-11-06
  • 2011-09-26
  • 2023-03-10
  • 1970-01-01
  • 2013-04-27
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
相关资源
最近更新 更多