为什么我在 Java 中使用 arraylist 覆盖输出?



我在这个块码上得到了覆盖的输出 我不明白为什么 当输入不同时, 我尝试打印我的数组列表,但它打印了两次 最后一名员工

public class Emplyee {
private String name;
private String surname;
private int age;
private String address;
public Emplyee() {  
}

public Emplyee(String name, String surname, int age, String address) {
this.name = name;
this.surname = surname;
this.age = age;
this.address = address ;
}
public void setName(String name) {
this.name = name;
}
public void setSurname(String surname) {
this.surname = surname;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}

@Override
public String toString() {
return "Emplyee [Name = " + name + ", Surname = " + surname + 
", Age = " + age + ", Address = " + address + "]";
}

}
main class
import java.io.*`enter code here`
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws Exception {

Emplyee emplyee = new Emplyee();
ArrayList<Emplyee> listAll=new ArrayList<>();
Scanner sc = new Scanner(System.in);
System.out.println("Do you want to add an Employee?"
+ "nType 1 for Yes and 0 for Exit");
while(sc.nextInt()!=0) {
if (sc.nextInt()==1) {
emplyee.getName();
System.out.println ("Name: ");
emplyee.setName(sc.next());
emplyee.getSurname();
System.out.println ("Surname: ");
emplyee.setSurname(sc.next());
emplyee.getAge();
System.out.println ("Age: ");
emplyee.setAge(sc.nextInt());
emplyee.getAddress();
System.out.println ("Address: ");
emplyee.setAddress(sc.next());
listAll.add(emplyee);
}
// return employees one by one
for (Emplyee employee : listAll) {
System.out.println(employee.toString());
}
}
//this print output in a .txt file
PrintWriter pw = new PrintWriter("Output.txt");
pw.println(listAll);
pw.flush();
pw.close();
System.out.println("Done!");        
}    
}

我放了两次不同的数据 输出为 :

Emplyee [姓名 = hysa, 姓氏 = sdas, 年龄 = 1, 地址 = 都拉斯]

Emplyee [姓名 = hysa, 姓氏 = sdas, 年龄 = 1, 地址 = 都拉斯]

您不断收到重复条目的原因是,当您创建新的Employee对象时,您只执行一次。这意味着您将在每次迭代中不断修改相同的对象,这些更改将反映在listAll中。在while循环中进行以下更改:

while(sc.nextInt()!=0) {
if (sc.nextInt()==1) {
// create new employee per iteration
Emplyee emplyee = new Emplyee ( );
emplyee.getName();
System.out.println ("Name: ");
emplyee.setName(sc.next());
...

通过每次迭代创建新的员工对象,现在可以用唯一员工填充列表。

此外,emplyee.getName()并没有在实际意义上使用,所以除非你打算稍后对此做点什么,否则你可以删除它以"加速"你的程序

最新更新