如何使用Java类中的对象创建Arraylist

时间:2019-02-12 04:45:17

标签: java class object arraylist

练习是要创建一个名为“租户”的类,该类将用于存储公寓的租户值。在主类Prog2中,我试图创建一个可以容纳4个不同值的ArrayList,这些值均与租户类有关,即-租户的姓名,公寓号,首次付款和每月付款。我希望能够将这些值打印在单独的行中,以便为每个租户提供全部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

2 个答案:

答案 0 :(得分: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可能很难使用,但这是一个示例,它可以清除问题。

答案 1 :(得分:0)

您的代码有很多错误。

  1. 的构造函数

    公共租户(字符串名称,字符串aptNum,双倍fPayment,双倍                                                     mPayment){     名称= fullName;     aptNum = aptNumber;     fPayment = firstPayment;     mPayment =每月付款; }

在这里,您不仅要为函数参数分配空值,还应从函数参数为类字段分配值。

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

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

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()));