【问题标题】:How to create an Arraylist with an object inside a class in java如何在java中的类中创建带有对象的Arraylist
【发布时间】:2019-02-12 04:45:17
【问题描述】:

练习是创建一个名为 Tenant 的类,用于存储公寓租户的值。在主类 Prog2 中,我试图创建一个 ArrayList,它可以保存 4 个不同的值,所有这些值都与租户类有关,它们是 - 租户的姓名、公寓号码、初始首付款和每月付款。我希望能够将这些值打印在单独的行中,这将为每个租户提供所有 4 条信息 - 然后是一个空白行,然后如果有另一个租户,则为另一个租户提供相同的 4 条信息。我可以让程序正确提示问题,但我得到的只是空值和 0 打印出来(见下面的评论)。感谢所有帮助 - 我不是这方面的佼佼者。

// this class is the tenant class that passes all the tenant's 
information

public class Tenant { 
    private String firstName;
    private String lastName;
    private String aptNumber;
    private double yearlyRent;
    private String fullName;
    private double firstPayment;
    private double monthlyPayment;

public Tenant(String name, String aptNum, double fPayment, double 
                                                    mPayment){
    name = fullName;
    aptNum = aptNumber;
    fPayment = firstPayment;
    mPayment= monthlyPayment;
}
public Tenant() {

}


public void setFirstName(String name) {
    firstName = name;
}
public void setLastName(String lName) {
    lastName= lName;
}
public void setAptNumber(String apt) {
    aptNumber = apt;
}
public void setRent(double rent) {
    yearlyRent = rent; 
}
public String getFirstName() {
    return firstName;
}
public String getLastName() {
    return lastName;
}
public String getAptNumber() {
    return aptNumber;
}
public double getRent() {
    return yearlyRent;
}
public double getFirstPayment() {
    double monthlyRent = yearlyRent/12;
    firstPayment = monthlyRent * 3;
    return firstPayment;
}
public double getmonthlyPayment() {
    double firstAndLast = yearlyRent/12;
    monthlyPayment = (yearlyRent - firstAndLast)/11;
    return monthlyPayment;
}
public String getFullName(){
    fullName = firstName + " " + lastName;
    return fullName;
}

}



// The below class contains the main method 





public class Prog2 {
    public static double getDouble(Scanner scan) {
        System.out.println("Enter yearly rent:");
        while (!scan.hasNextDouble()) {
           scan.next();
           System.out.println("Error: please enter a numeric 
           value");
        }
        return scan.nextDouble();
}

public static void main(String[] args) {
    Tenant tnt = new Tenant();
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter number of tenenats:");
    int numTenants = scan.nextInt();
    ArrayList<Tenant> list = new ArrayList<Tenant>();

    for (int i = 0; i<numTenants; i++) {
        System.out.println("Enter first name:");
        tnt.setFirstName(scan.next());
        System.out.println("Enter last name:");
        tnt.setLastName(scan.next());
        System.out.println("Enter apt number:");
        tnt.setAptNumber(scan.next());
        tnt.setRent(getDouble(scan));
        list.add(new Tenant(tnt.getFullName(), tnt.getAptNumber(), 
        tnt.getFirstPayment(), tnt.getmonthlyPayment()));             
    }
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).getFullName());
        System.out.println(list.get(i).getAptNumber());
        System.out.println(list.get(i).getFirstPayment());
        System.out.println(list.get(i).getmonthlyPayment());
        System.out.println();
    }

}

}
// this prints out: 
null null
null
0.0
0.0

null null
null
0.0
0.0

【问题讨论】:

  • 你的构造函数赋值是向后的。
  • 这似乎是你尝试我们做的课堂作业......我希望我错了。

标签: java class object arraylist


【解决方案1】:

问题在于Tenant 类中的第一个构造函数。请记住,= 运算符将右操作数的值分配给左操作数中的变量。在您的情况下,代码应如下所示:

public Tenant(
        String name, 
        String aptNum, 
        double fPayment, 
        double mPayment)
{
    fullName = name;
    aptNumber = aptNum;
    firstPayment = fPayment;
    monthlyPayment = mPayment;
}

我通常对构造函数做的是在字段之后命名参数,然后在字段分配的左侧使用this 来引用字段而不是参数。这最终看起来更加清晰:

public Tenant(
        String fullName, 
        String aptNumber, 
        double firstPayment, 
        double monthlyPayment)
{
    this.fullName = fullname;
    this.aptNumber = aptNumber;
    this.firstPayment = firstPayment;
    this.monthlyPayment = monthlyPayment;
}

this 可能很难使用,但这是一个可以解决问题的示例。

【讨论】:

  • 另一个有用的技巧是使参数最终化——因为我们不应该在构造函数中更新它们的值。这会导致代码中出现语法错误,这表明我们的做法是错误的。
【解决方案2】:

您的代码有很多问题。

  1. 构造函数

    public Tenant(String name, String aptNum, double fPayment, double 移动支付){ 名称=全名; aptNum = aptNumber; fPayment = firstPayment; mPayment=每月付款; }

在这里,您不只是将空值分配给函数参数,而不是从函数参数为类字段分配值。

此外,当您调用函数 getFullName() 时,它将返回 null,因为 firstName 和 lastName 字段未初始化。

因此,您需要将构造函数修改为 -

public Tenant(String firstNamename, String lastName, String aptNum, double fPayment, double
                                                    mPayment){
    this.firstName = firstNamename;
    this.lastName = lastName;
    this.aptNumber = aptNum;
    this.firstPayment = fPayment;
    this.monthlyPayment = mPayment;
    this.fullName = getFullName();
}

同样在for循环中,你需要改变

list.add(new Tenant(tnt.getFullName(), tnt.getAptNumber(), 
        tnt.getFirstPayment(), tnt.getmonthlyPayment())); 

到-

list.add(new Tenant(tnt.getFirstName(),tnt.getLastName(), tnt.getAptNumber(),
        tnt.getFirstPayment(), tnt.getmonthlyPayment()));

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2015-12-01
    相关资源
    最近更新 更多