0

我有一个奇怪的问题,我知道如何解决,但这次我想用数组列表来解决。问题是:我有一棵员工树。Employee 是一个简单的类(下面是为该员工工作的员工列表):

class Employee
{
    String name;
    ArrayList<Employee> under = new ArrayList<Employee>();

    //fire function
}

我的任务是递归解雇所有没有员工的员工。我知道如何使用定制的列表数据结构来解决这个问题,但我想用数组列表来做。到目前为止,这是我的代码:

public boolean Fire()
{
    if (under.isEmpty())
        return true;
    else
    {
        for (int x = 0; x < under.size(); x ++)
        {
             if (under.get(x).Fire())
                 under.remove(x);

        }

    }

    return false;
}

但是这段代码的问题是,当我删除under.remove(x)时,under.size()变得更小并且索引变得混乱。我尝试在每个under.remove(x)之后设置x = 0 ,但它并没有完全正确。一名员工还剩下很多。任何具有数组列表结构的解决方案?

4

3 回答 3

5

这是删除或删除的经典问题。

您必须向后遍历列表。这样,当您删除一个元素时,您不会跳过其他元素或超出列表的末尾。

public boolean Fire()
{
    if (under.isEmpty())
        return true;
    else
    {
        for (int x = under.size() - 1; x >= 0; x--)
        {
             if (under.get(x).Fire())
                 under.remove(x);

        }

    }

    return false;
}
于 2013-05-03T17:01:11.297 回答
2

尝试使用迭代器。您只需.next()在迭代器上继续遍历它,每当您发现有人在他手下没有员工时,您调用.remove()(在迭代器上)这将删除迭代器给您的最后一个元素。

于 2013-05-03T17:00:40.073 回答
0

这就是 Iterator 具有 remove() 方法的原因。查找 Collection 的 iterator() 调用并在你的 for 循环中使用它。

于 2013-05-03T17:01:50.123 回答