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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:50:46