Ошибка переполнения стека при удалении узлов дерева - PullRequest
0 голосов
/ 10 января 2012

У меня есть древовидная структура в этом формате:

Index1
|
 --Key1
 --Value1 
Index2
|
 --Key2
 --Value2

Key и Value объекты являются потомками Index объектов, и в дереве нет индексных объектов.

Я поддерживаю списки массивов для Index объектов (indexList), Key объектов (keyList) и Value объектов (valueList).

viewer - этообъект TreeViewer.

Моя цель состоит в том, чтобы удалить объект Index и код, ответственный за это действие:

String indexName = text.getText();

for(int i =0; i< model.indexList.size(); i++)
{                   
    if(model.indexList.get(i).getName().equals(indexName))
    {
        Index temp = model.indexList.get(i);
        int noOfKeys   =  temp.keyList.size();
        int noOfValues =  temp.valueList.size();

        for(int j=0; j<noOfKeys ; j++ )
        {
            temp.keyList.remove(j);
            temp.valueList.remove(j);
        } 

        model.indexList.remove(i);
        break;
    }
}
viewer.refresh();

Когда я выполняю действие удаления, узел удаляется, но со стекомошибка переполнения.

Пожалуйста, дайте мне знать, где я ошибся.

1 Ответ

1 голос
/ 10 января 2012

Ошибка в том, что вы удаляете элементы из списка в цикле for, т.е.

for(int j=0; j<noOfKeys ; j++ )
                    {
                        temp.keyList.remove(j);
                        temp.valueList.remove(j);
                    } 

наиболее вероятно источник ошибки.

Каждый раз, когда вы удаляете что-либо из списка, относительные значения индекса всех элементов будут меняться. Например, temp.keylist.remove (0) удалит нулевой элемент, а элемент с индексом 1 переместится на нулевой индекс. Теперь для следующей итерации j уже увеличено до 1 (но вместо этого должно было быть ноль)

Попробуйте прокомментировать приведенный выше раздел кода, который я указал, и вы не должны получить ошибку переполнения (это будет ваша первая проверка, чтобы обнулить, какая часть кода вызывает проблему)

Следующим шагом будет попробовать что-то вроде

temp.keyList.clear()
temp.valueList.clear()

вместо приведенного выше цикла for.

...