0

タイトルが示すように、C# では、この remove メソッドを変更して、配列の最後の項目を取得し、削除された値の代わりに移動しようとしています。このように、要素を削除するときに、個々の番号をすべて取得してスペースを上に移動する必要はありません。

これが私の現在のコードです:

        public override void remove(ref T item)
    {
        if (next == 0)
        {
        }
        else
        {
            //find value, if it exists
            for (int i = 0; i < next; i++)
            {
                if (item.Equals(list[i]))
                {
                    for (int j = i; j < next; j++) list[j] = list[j + 1];
                    next--;
                    break;
                }
            }
        }
    }

どんな助けでも大歓迎です。

値を配列に挿入するための私のコードは次のとおりです。

{
        UnorderedArrayList<int> u = new UnorderedArrayList<int>();
        u.print();
        int var = 5;
        u.insert(ref var);
        var = 12;
        u.insert(ref var);
        var = 2;
        u.insert(ref var);
        var = 29;
        u.insert(ref var);
        u.print();
        var = 5;
        u.remove(ref var);
        u.print();
    }
4

2 に答える 2

1

内側のループを、最後の項目を移動してから最後の項目をクリアするコードに置き換えるだけです。

public override void remove(ref T item)
{
    // find value, if it exists
    for (int i = 0; i < next; i++)
    {
        if (item.Equals(list[i]))
        {
            list[i] = list[next-1];
            list[next-1] = default(T);
            next--;
            break;
        }
    }
}

条件によってチェックされるnext == 0ため、最初にチェックする必要はありません。forの場合next == 0、ループは反復を行いません。

アイテムが見つかると、コードは最後のアイテムを移動して、見つかったインデックスのアイテムを置き換えます。次に、最後の項目をdefault(T)(null参照型用) に設定します。そうしないと、メモリリークが発生します。削除したと思われるものへの参照が保存されます。リストの操作には影響しませんが、意図したよりも多くのメモリを使用する可能性があります。

于 2013-09-19T23:21:18.653 に答える