Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коллекции и дерево. Что посоветуете ? 
:(
    Опции темы
math64
Дата 12.11.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Это в коде:
Код

for(Node child : del.childs) // Итератор спрятан в for - так удобнее
    deleteNode(child);

deleteNode(child) изменяет список del.childs, а скрытый итератор проверяет список на модификацию
В пиннципе, в рекурсивном вызове достаточно сделать только nodesById.remove(del.id); остальное соберёт мусорщик.
Код

public void deleteNode(Node del) throws TreeIndexOutOfBoundsException{
  if (del == null)
    throw new TreeIndexOutOfBoundsException();
  if (ROOT_IS_NOT_DELETABLE && del == root)
    throw new TreeIndexOutOfBoundsException();
  Node parent = del.parent;
  if (parent != null)
    parent.childs.remove(del);
  deleteNode2(del);
}

private void deleteNode2(Node del) {
  nodesById.remove(del.id);
  for(Node child : del.childs)
    deleteNode2(child);
}


PM   Вверх
Felixx
Дата 12.11.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Яб заюзал что то типа <Map, TESTOBJETC> objects = new TreeMap<Map, TESTOBJETC>();
А с обьектом чо хош то и делай.и всегда он разный. а Key у всех разный.
PM MAIL   Вверх
ci5
Дата 14.11.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.12.2008

Репутация: нет
Всего: нет



Спасибо большое! Наконец-то реализовал это дело. пришлось еще помучиться с самой картой. Я её проходил как 
Код

for(int i=0;i<nodesById.size();i++){ 
          Node aNode = nodesById.get(i);
            if (aNode != null)
                System.out.println("element name="+this.getNodeName(i)+"; id="+this.getNode(i).id);

и получал такую картину (ввожу 16 элементов)
Цитата
element name=derevo; id=0
element name=1; id=1
null
element name=3; id=3
element name=4; id=4
null
null
null
element name=8; id=8
element name=9; id=9
element name=10; id=10
element name=11; id=11
element name=12; id=12
element name=13; id=13
13

поменял на итератор и всё встало на свои места. 
Код

        for (int i : nodesById.keySet()){
          Node aNode = nodesById.get(i);
            if (aNode != null)
                System.out.println("element name="+this.getNodeName(i)+"; id="+this.getNode(i).id);

правда не понял я лично почему так произошло и почему map не почистил нулевые ссылки. Причем размер правильный выдаётся, а вот до последних 3-х элементов карта не доходила.
PM MAIL   Вверх
math64
Дата 17.11.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Он может их почистить (если правильно чистить), но не сможет сделать перенумерацию - после удаления узлов в их нумерации остаются дырки.
Когда делаешь get(i), где i - удалённый дескриптор, получишь null.
Так что перебор keySet() - единственно правильный метод. Но если использовать HashMap, то ещё и порядок распечатки будет произвольный.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.