
BlinCT
Реализация алгоритма для поиска обьекта
Всем привет.
Я не силен в алгаритмах, но вот тут возникла проблемка, надо код который работает но с ошибками (да еще и с go to) переделать на нормальный человеческий вид.
Его принцип такой что надо ходить в цикле по обьектам пока не найдем тот который нужно. Движение в направлениях только вверх и вниз.
Ниже привожу кусок кода что является тем который работает но требует как в песне перемен.
QQuickItem * Stack::find(StackItem item, Stack::Direction direction) { QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = qobject_cast<QQuickItem *>(itemFocus->parent()); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); try_another: if(direction == Direction::Up && list.length() > i+1) i++; else if(direction == Direction::Down && i > 0) i--; else { itemNext = itemPrev; itemPrev = qobject_cast<QQuickItem *>(qobject_cast<QQuickItem *>(itemPrev)->parent()); if(itemPrev) { if(itemNext == itemPage) return nullptr; list = childrenOf(itemPrev); i = list.indexOf(itemNext); goto try_another; } else return nullptr; } deeper: if(i < 0 || i > (list.length()-1)) { qDebug() << "fuck invalid index, parent" << itemPrev << i; return nullptr; } itemNext = list[i]; if(itemNext->isVisible() && itemNext->isEnabled()) { if(isEnabledOn(itemNext)) { res = itemNext; goto result; } else { if(childrenOf(itemNext).count()) { if(direction == Direction::Down) i = 0; else i = childrenOf(itemNext).count()-1; itemPrev = itemNext; list = childrenOf(itemPrev); goto deeper; } goto try_another; } } else goto try_another; result: return res; }
А вот так выглядит часть начатой реализации в которой как раз есть нужные циклы за счет которых будет происходить поиск. То есть то что выше в коде надо в правильном порядке чтоли перетащить сюда.
QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = itemFocus->parentItem(); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); list = childrenOf(itemFocus->parentItem()); bool found = false; while (!found) // TODO: if not found { if(direction == Direction::Down) { // TODO: если индекс карента не последний while () // TODO: if last { // visible and enabled } } else if(direction == Direction::Up) { while () // TODO: if first { // visible and enabled } } } return res;
Так же я думаю важным отличием от кода с go to и на что надо переписать так это несколько переменных что будут помогать в поиске. first, last, direction, childre(yes, no)
И прикрепляю файлик с самим алгаритмом. В нем расмотренны все варианты. И само представленеи обьектов по которым происходит поиск.
Дерево
Алгоритм
Надеюсь кто то сможет с этим помочь.
Спасибо.

Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate
Здравствуйте, уважаемые пользователи EVILEG !!!
Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.
Вы можете сделать это следующими способами:
- PayPal
- Yandex.Money
- Bitcoin: 13aqaPG8NZhX3By3he9LtrnHsmvRgsbt95
- Patreon - в Patreon я написал свои цели по сокращению рекламы на сайте
Спасибо, Евгений Легоцкой