Сортировать список нехватки памяти в Unity 3d? - PullRequest
0 голосов
/ 04 апреля 2019

Редактор говорит об ошибке: Недостаточно памяти. Привет, ребята, я узнаю о отсортированном списке. Метод PrintMessage запускается каждую секунду. И функция Add вызывает ошибку. Сможете ли вы сказать, что не так, основываясь на ударе кода? Спасибо.

void PrintMessage(GameObject gameObject) {
    Target newTarget = new Target(gameObject, transform.position);
    targets.Add(newTarget);
    print(targets[targets.Count-1].Distance.ToString());
}

public void Add(T item)
{
    int num;
    // add your implementation below
    if (items.Count != 0)
    {
        for (int i = 0; i < items.Count; i++)
        {
            num = item.CompareTo(items[i]);
            if (num >= 0)
            {
                tempList.AddRange(items.GetRange(i, items.Count - i));
                items.RemoveRange(i, items.Count - i);
                items.Add(item);
                items.AddRange(tempList);
                tempList.Clear();
                continue;
            }
        }
        items.Add(item);
    }
    else
    {
        items.Add(item);
    }
}

1 Ответ

1 голос
/ 04 апреля 2019

Проблема в том, что внутри

for (int i = 0; i < items.Count; i++)
{
    ...
    items.Add(item);
    ...
}

вы постоянно добавляете все больше и больше предметов. Таким образом, на каждой итерации цикла items.Count будет на +1 элемент больше => условие выхода i >= items.Count никогда не будет выполнено.

& RightArrow; Никогда не изменяет счетчик списка при переборе одного и того же списка!

Причина, по которой в конце концов вы используете continue (переходите к следующей итерации) ... это не имеет смысла, поскольку в этот момент в любом случае начнется следующая итерация.

Вы, вероятно, можете break (прервать цикл) или даже return, так как в любом случае сразу после цикла вы снова вызываете items.Add(item) ...


Вы, вероятно, скорее хотите использовать List<T>.Insert(int index, T item)

public void Add(T item)
{
    int newIndex = 0;

    // You don't need an additional if-else
    // since this loop is anyway never executed
    // if (items.Count == 0)
    for (int i = 0; i < items.Count; i++)
    {
        num = item.CompareTo(items[i]);
        if (num >= 0)
        {
            // we want to add the new item AFTER
            // the item we compared it to
            newIndex = i+1;
            return;
        }
    }

    // Inserts the item at index newIndex
    // if newIndex == items.Count this equals Add
    items.Insert(newIndex, item);
}

Обратите внимание, что это на самом деле уже существует!

Называется SortedSet<T>

...