You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将员工数据整合为Employee类型数组?Java代码改造求助

改造Java员工管理代码:整合为Employee对象数组

核心需求

将现有通过三个独立数组(Name、Address、Date)存储员工信息的代码,改造为用Employee类整合单个员工的所有信息,再存入Employee[]数组,员工数量由变量n控制。

现有代码问题说明

  1. 输入流提前关闭:Main类中input.close()放在for循环内部,会导致第一次循环后Scanner就被关闭,后续输入报错。
  2. 日期验证逻辑错误:月份验证的while循环条件写反(应为mo < 1 || mo > 12),且错误使用break,无法实现循环输入修正。
  3. Getter方法冗余参数:Name、Address、Date类的getter方法无需传入参数,现有写法不符合JavaBean规范。
  4. setName方法逻辑错误:你尝试的setName方法混淆了数组与对象的调用逻辑,Employee类中应持有Name对象,而非字符串数组。

改造步骤与完整代码

1. 创建Employee类

该类整合Name、Address、Date对象,提供构造方法与必要的setter/getter,重写toString方便打印:

public class Employee {
    private Name name;
    private Address address;
    private Date hireDate;

    // 全参数构造方法
    public Employee(Name name, Address address, Date hireDate) {
        this.name = name;
        this.address = address;
        this.hireDate = hireDate;
    }

    // 针对Name的setter方法
    public void setName(Name name) {
        this.name = name;
    }

    // 其他属性的setter/getter可按需添加
    public Name getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

    public Date getHireDate() {
        return hireDate;
    }

    @Override
    public String toString() {
        return name.toString() + "\n" + address.toString() + "\n" + hireDate.toString() + "\n";
    }
}

2. 修复Name/Address/Date类的Getter方法

以Name类为例,其他类同理移除getter的冗余参数:

public class Name {
    private String firstName;
    private String lastName;
    private String idNumber;

    // 修正后的Getter(无参数)
    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getIdNumber() {
        return idNumber;
    }

    // 保留原有构造方法与toString
    public Name(String fn, String ln, String id) {
        firstName = fn;
        lastName = ln;
        idNumber = id;
    }

    @Override
    public String toString() {
        return "\nEmployee Name: " + firstName + " " + lastName + "\nEmployee ID#: " + idNumber;
    }
}

Address类修正后:

public class Address {
    private String street;
    private String city;
    private String state;
    private String zipcode;

    // 修正Getter
    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }

    public String getState() {
        return state;
    }

    public String getZipcode() {
        return zipcode;
    }

    public Address(String str, String cty, String sta, String zip) {
        street = str;
        city = cty;
        state = sta;
        zipcode = zip;
    }

    @Override
    public String toString() {
        return "Address: " + street + ", " + city + ", " + state + " " + zipcode;
    }
}

Date类修正后:

public class Date {
    private int month;
    private int day;
    private int year;

    // 修正Getter
    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public int getYear() {
        return year;
    }

    public Date(int mo, int dy, int yr) {
        month = mo;
        day = dy;
        year = yr;
    }

    @Override
    public String toString() {
        return "Hiring Date: " + month + "/" + day + "/" + year;
    }
}

3. 修改Main类:使用Employee数组存储

修复输入流关闭位置、日期验证逻辑,替换为Employee数组:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Employee Database\n\nEnter the number of employees to add: ");
        final int n = input.nextInt();

        // 替换为Employee数组
        Employee[] employees = new Employee[n];

        for (int i = 0; i < n; i++) {
            System.out.println("- - - NEW EMPLOYEE - - -\n");
            System.out.println("Basic Information");
            System.out.println("- - - - - - - - - - - -");
            System.out.println("Enter first name as <First>: ");
            String fn = input.next();
            System.out.println("Enter last name as <Last>: ");
            String ln = input.next();
            System.out.println("Enter employee ID as <1A45G>: ");
            String id = input.next();

            System.out.println("Address Information");
            System.out.println("- - - - - - - - - - - -");
            System.out.println("Enter street <123.High.Street>: ");
            String str = input.next();
            System.out.println("Enter city <Springfield>: ");
            String cty = input.next();
            System.out.println("Enter state <XX>: ");
            String sta = input.next();
            System.out.println("Enter zip code <54321>: ");
            String zip = input.next();

            System.out.println("Hiring Date Information");
            System.out.println("- - - - - - - - - - - -");
            System.out.println("Enter hiring month as <12>: ");
            int mo = input.nextInt();
            // 修复日期验证逻辑
            while (mo < 1 || mo > 12) {
                System.out.println("Incorrect format entered. Please try again: ");
                mo = input.nextInt();
            }
            System.out.println("Enter hiring day as <31>: ");
            int day = input.nextInt();
            System.out.println("Enter hiring year as <2023>: ");
            int year = input.nextInt();

            // 创建各子对象,再封装为Employee对象存入数组
            Name name = new Name(fn, ln, id);
            Address address = new Address(str, cty, sta, zip);
            Date hireDate = new Date(mo, day, year);
            employees[i] = new Employee(name, address, hireDate);
        }
        // 循环结束后再关闭输入流
        input.close();

        // 打印员工列表
        System.out.println("Printing Employee list.....\n");
        for (Employee employee : employees) {
            System.out.println(employee);
        }
    }
}

关键说明

  • 你之前尝试的setName方法错误在于:Employee类持有Name对象而非字符串数组,正确的setName应接收一个Name实例,或拆分参数创建Name对象后赋值。
  • 改造后代码实现了单一职责:每个员工的所有信息封装在一个Employee对象中,更符合面向对象设计思想,也便于后续扩展。

内容的提问来源于stack exchange,提问作者visceralamoeba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:55:21