我怎样才能避免计算器异常
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 );
}
我认为这个程序有很多问题。
- 您不能遍历列表并尝试同时操作它
- 没有删除标识的逻辑 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);
}
}
我有一个层次结构对象列表,如果层次结构的值为零,我必须删除层次结构。
我必须撤掉所有的经理(员工) 当且仅当 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 );
}
我认为这个程序有很多问题。
- 您不能遍历列表并尝试同时操作它
- 没有删除标识的逻辑 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);
}
}