【问题标题】:move an object from one array list to another将对象从一个数组列表移动到另一个
【发布时间】:2016-11-20 23:48:24
【问题描述】:

我有一个类,它包含私有变量(例如employeeName 和employeeNumber)以及设置和获取employeeName 和employeeNumber 的方法。此类称为“EmployeesInformation”。在这个类中,我有两个构造函数。一个获取员工信息,例如EmployeesInformation(String name, String phoneNumber){...},另一个获取相同的信息但还接收两个额外的信息,例如 String datefired 和 String reasonForLeave。

现在在另一个名为“MenuOptionMethods”的类中,我有 addEmployee 方法和 fireEmployee 方法以及另一个显示员工信息的方法。 我在这个类中创建了两个arrayList,分别称为employee 和formerEmployee。

每当用户添加员工时,我都会将该员工对象放入名为employee 的arrayList 中。当用户解雇或删除员工时,我想获取该员工的所有信息,将其从 arrayList 员工中删除并将其添加到 arrayList 前员工。那就是我遇到问题的地方。有人可以看看我的代码并告诉我它有什么问题吗?

public class menuOptionMethods {
Scanner sc = new Scanner(System.in);
private ArrayList<EmployeesInformation> employee;
private ArrayList<EmployeesInformation> formerEmployee;

public menuOptionMethods() {
    employee = new ArrayList<EmployeesInformation>();
    formerEmployee = new ArrayList<EmployeesInformation>();
}

public void addEmployee(String eName) {     
    String n = eName;
    System.out.println(" Enter date hired: ");
    String h = sc.next();
    System.out.println(" Enter employee's duty: ");
    String d = sc.next();
    System.out.println(" Enter employee's phone number: ");
    String pN = sc.next();
    System.out.println(" Enter employee's pay per hour: ");
    double pPH = sc.nextInt();
    System.out
            .println(" Enter any additional information about employee: ");
    String l = sc.next();
    EmployeesInformation e = new EmployeesInformation(n, h, d, l, pN, pPH);
    employee.add(e);
}

public void fireEmployee(String eName) {
    // System.out.println("Enter employee's name: ");
    // String name = eName;
    System.out.println("Reason for employee's leave?: ");
    String reason = sc.next();
    System.out.println("Enter date: ");
    String dF = sc.next();
for(int i=0; i<employee.size(); i++){
      if(employee.get(i).getEmployeName().contains(eName)){ 
          n = eName; 
          h = employee.get(i).getDateHired(); 
          d = employee.get(i).getEmployeDuty();
          pH = employee.get(i).getPhoneNumber(); 
          pPH = employee.get(i).getEmployePay(); 
          l = employee.get(i).getAdditionalInformation();
          employee.remove(i); 
          } 
      }
      EmployeesInformation fE = new  EmployeesInformation(n,h,d,l,pH,pPH,reason,dF); // ERROR HAPPENS HERE

}

}

【问题讨论】:

    标签: java object arraylist


    【解决方案1】:

    在使用 for 循环迭代时,您不能从列表中删除元素(它会抛出 ConcurrentModificationException。为此,您需要使用迭代器并调用 remove() 方法,例如:

    for(Iterator<Employee> iterator = employees.iterator() ; iterator.hasNext();){
        Employee current = iterator.next();
        if(current.getName().equals(name)){
            iterator.remove();
            //Add into former employees' list
            break;
        }
    }
    

    这将从现有列表中删除。

    【讨论】:

    • 不确定迭代器是如何工作的,但我如何将它添加到前雇员数组列表中?
    • 你可以做formerEmployee.add(current);
    【解决方案2】:

    在您的 for 循环中,您不想执行任何删除操作,因为 arraylist 的大小会发生变化,而这只会造成让您失望的重击。假设每个员工都有一个唯一的名字,你可以这样做(注意我通过将员工对象从一个数组列表转移到另一个来简化所有这些新变量):

      int index;
      for(int i=0; i<employee.size(); i++){
      if(employee.get(i).getEmployeName().contains(eName)){ 
          formerEmployee.add(employee[i]); //date fired and reason fired can be added later
          index = i;
          break; 
          } 
      }
      employee.remove(i);
    

    }

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2017-07-11
      • 2020-01-12
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多