如何在for循环外以数组形式打印多类型用户输入的人员数据?
问题解决与代码实现
现有代码的核心问题
- 循环复用单个
peoples对象,最终只会保留最后一位人员的数据 scan.nextDouble()执行后未处理残留的换行符,导致下一次scan.nextLine()读取空字符串- 未调用税费计算逻辑,
taxAmount未赋值就传入方法 - 存储多人员数据应该用集合而非单个对象
解决方案代码
1. 人员详情类(Person)
负责存储单个人的所有信息,用类属性封装不同类型的数据,比数组更直观易维护:
public class Person { private String name; private String icNo; private String maritalStatus; private double taxableIncome; private double taxAmount; // 构造方法,初始化人员信息 public Person(String name, String icNo, String maritalStatus, double taxableIncome, double taxAmount) { this.name = name; this.icNo = icNo; this.maritalStatus = maritalStatus; this.taxableIncome = taxableIncome; this.taxAmount = taxAmount; } // 打印数据需要用到的Getter方法 public String getName() { return name; } public String getIcNo() { return icNo; } public double getTaxableIncome() { return taxableIncome; } public double getTaxAmount() { return taxAmount; } }
2. 税费计算类(TaxCalculator)
专注实现税费计算逻辑,和数据存储解耦:
public class TaxCalculator { public static double calculateTax(String maritalStatus, double taxableIncome) { // 示例计算规则,可替换为实际税费政策 if (taxableIncome <= 0) { return 0; } return switch (maritalStatus.toLowerCase()) { case "married" -> taxableIncome * 0.15; case "single" -> taxableIncome * 0.20; default -> taxableIncome * 0.18; // 默认税率 }; } }
3. 主业务逻辑类(Main)
处理用户输入、调用计算、存储数据并格式化输出:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); List<Person> personList = new ArrayList<>(); int personCount = 2; // 可改为让用户输入人数,此处固定2人以上 for (int i = 0; i < personCount; i++) { System.out.println("请输入第" + (i+1) + "位人员的姓名: "); String name = scan.nextLine(); System.out.println("请输入身份证号: "); String icNo = scan.nextLine(); System.out.println("请输入婚姻状态(如single/married): "); String maritalStatus = scan.nextLine(); System.out.println("请输入应税收入: "); double taxableIncome = scan.nextDouble(); // 解决nextDouble后换行符残留的问题 scan.nextLine(); // 计算税额 double taxAmount = TaxCalculator.calculateTax(maritalStatus, taxableIncome); // 创建新的Person对象并加入集合 Person person = new Person(name, icNo, maritalStatus, taxableIncome, taxAmount); personList.add(person); } // 格式化打印表头和所有人员数据 System.out.printf("%-15s %-20s %-20s %-15s%n", "NAME", "IC NO", "TAXABLE INCOME", "TAX AMOUNT"); System.out.println("--------------------------------------------------------------------------------"); for (Person person : personList) { System.out.printf("%-15s %-20s %-20.2f %-15.2f%n", person.getName(), person.getIcNo(), person.getTaxableIncome(), person.getTaxAmount()); } scan.close(); } }
关键改进说明
- 用
List<Person>存储多人员数据,每个循环创建新对象,避免数据覆盖 - 职责拆分:数据存储、税费计算、业务逻辑分离,代码更清晰易维护
- 修复了
Scanner的换行符问题,保证输入流程正常 - 用
printf实现对齐的格式化输出,符合指定表头的打印要求
内容的提问来源于stack exchange,提问作者jaytee
相关产品推荐
相关产品推荐

