繁体   English   中英

如何在java中的类中创建一个带有对象的Arraylist

[英]How to create an Arraylist with an object inside a class in java

练习是创建一个名为 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

问题在于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可能很难使用,但这是一个可以解决问题的示例。

您的代码有很多问题。

  1. 的构造函数

    公共租户(字符串名称,字符串 aptNum,双 fPayment,双 mPayment){ name = fullName; 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()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM