我怎样才能避免计算器异常

How can I avoid stackoverflow exception

我有一个层次结构对象列表,如果层次结构的值为零,我必须删除层次结构。

我必须撤掉所有的经理(员工) 当且仅当 emp salary 为 0 并且他手下没有员工。 或者他手下所有员工的工资都是零。 但如果经理工资为零且他手下的员工工资不为零,则不会。

例如。

emp(10)
    |---- empA(9)
            |---- empAa(8)
            |---- empAb(7)
            |---- empAc(0)
    |---- empB(7)
            |---- empBa(0)
                    |---- empBaa(0)
                            |---- empBaaa(0)
            |---- empBb(0)
                    |---- empBba(4)

上面的结构必须修改如下。

emp(10)
    |---- empA(9)
            |---- empAa(8)
            |---- empAb(7)
    |---- empB(7)
            |---- empBb(0)
                    |---- empBba(4)

当输入列表很大时,我遇到了 Whosebug 异常。我应该如何增强此逻辑以避免 SOFE。

    removeHierarchy(List<Employee> managers){
        int count = 0;
        if(null != managers && !managers.isEmpty()){
            for(Employee manager: managers){
            List<Employee> toBeRemoved = new ArrayList<>();
            List<Employee> employees = manager.getEmployees();
                if(0 == manager.getSalary()){
                    if(null == employees || employees.isEmpty()){
                        toBeRemoved.add(manager);
                    } else {
                        ++count;
                        removeHierarchy(employees);
                    }
                } else {
                    removeHierarchy(employees);
                }
                managers.removeAll(toBeRemoved);
            }
        }

        for(int i=0; i < count; i++){
            removeHierarchy(managers);
        }
    }

我认为你的问题是你实际上并没有从列表中删除任何员工。如果列表有这样的配置——你将在最后一行进入无限循环。

emp(0)
 |---- empA(0)

最后几行似乎应该是 managers.removeAll(toBeRemoved)

这是工作函数:

void removeHierarchy( List<Employee> managers )
  {
    List<Employee> toBeRemoved = new ArrayList<>();
    for ( Employee manager : managers )
    {
      removeHierarchy( manager.getEmployees() );
      if (0 == manager.getSalary() && manager.getEmployees().isEmpty()) {
        toBeRemoved.add( manager );
      }
    }
    managers.removeAll( toBeRemoved );
  }

full test code

我认为这个程序有很多问题。

  1. 您不能遍历列表并尝试同时操作它
  2. 没有删除标识的逻辑 managers/employees

按照 John 的建议,我正在添加可以执行所需任务的方法。除了我使用了 Java 8 语法糖外,其他答案中提供的解决方案没有什么不同。

public static boolean removeEmployee(Employee employee)
{
    employee.setEmployees(employee.getEmployees().stream().filter(Employee::removeEmployee).collect(Collectors.toList()));
    return !(employee.getSalary()==0 && employee.getEmployees().size()==0);
}

注意:确保您的数组列表(员工列表)不为空,即创建员工对象时为空数组列表。

要决定是否必须保留或删除 Employee,您必须首先处理她的员工名单:

void removeHierarchy(List<Employee> managers){
    if(null != managers && !managers.isEmpty()){
        List<Employee> toBeRemoved = new ArrayList<>();
        for(Employee manager: managers) {
            List<Employee> employees = manager.getEmployees();
            removeHierarchy(employees);
            if (0 == manager.getSalary()
                    && (null == employees || employees.isEmpty())) {
                toBeRemoved.add(manager);
            }
        }
        managers.removeAll(toBeRemoved);
    }
}