0

私は回避策を知っている奇妙な問題を抱えていますが、今回は配列リストでそれをやりたいと思っています。問題は次のとおりです。従業員のツリーがあります。従業員は単純なクラスです (以下は、この従業員のために働く従業員のリストです)。

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 に答える