如何将员工数据整合为Employee类型数组?Java代码改造求助
改造Java员工管理代码:整合为Employee对象数组
核心需求
将现有通过三个独立数组(Name、Address、Date)存储员工信息的代码,改造为用Employee类整合单个员工的所有信息,再存入Employee[]数组,员工数量由变量n控制。
现有代码问题说明
- 输入流提前关闭:
Main类中input.close()放在for循环内部,会导致第一次循环后Scanner就被关闭,后续输入报错。 - 日期验证逻辑错误:月份验证的while循环条件写反(应为
mo < 1 || mo > 12),且错误使用break,无法实现循环输入修正。 - Getter方法冗余参数:Name、Address、Date类的getter方法无需传入参数,现有写法不符合JavaBean规范。
- 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
相关产品推荐
相关产品推荐

