Russian Qt Forum
Май 06, 2024, 22:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пример удаления повторяющихся элементов в QListWidget  (Прочитано 10302 раз)
merke
Гость
« : Август 24, 2010, 09:36 »

Код:
for (int i = 0; i< ui->listWidget->count(); i++)
        {
            t = 0;
            for (int j = 0; j< ui->listWidget->count(); j++)
            {
                if (ui->listWidget->item(i)->text() == ui->listWidget->item(j)->text())
                {
                    t++;
                    if (t > 1) delete ui->listWidget->takeItem(j);
                }
            }
        }

Возможно реализация не самая эффективная. Жду более оптимизированных вариантов.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 24, 2010, 16:53 »

Код
C++ (Qt)
for (int i = 0; i < listWidget->count(); i++) {
 for (int j = i + 1; j < listWidget->count(); j++) {
   if (listWidget->item (i)->text () == listWidget->item (j)->text ()) {
     delete ui->listWidget->takeItem(j);
     j--;
   }
 }
}
 
Не сильно вдавался, но так лучше.
« Последнее редактирование: Август 25, 2010, 06:25 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
SABROG
Гость
« Ответ #2 : Август 24, 2010, 20:24 »

А это точно лучше, сравнивать итем самим с собою?

Код
C++ (Qt)
listWidget->item (i)->text () == listWidget->item (i)->text ()
 
Записан
kobra
Гость
« Ответ #3 : Август 24, 2010, 23:21 »

этот пример дает O(N2). Второй способ что здесь навели немного лучше если не считать маленькой опечатки. Если можна список посортировать то тогда удаления елементов можна сделать за один проход.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Август 25, 2010, 06:25 »

SABROG, очепятался. Сейчас подправлю.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
SABROG
Гость
« Ответ #5 : Август 25, 2010, 08:14 »

На самом деле все как-то не так. Вместо того, чтобы удалять лишние элементы из списка, можно делать проверку есть ли такой уже и просто не добавлять дубликат. Но больше всего мне не нравится привязка всего к одной роли Qt::DisplayRole, когда их там может быть любое количество.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Август 25, 2010, 11:22 »

На самом деле все как-то не так. Вместо того, чтобы удалять лишние элементы из списка, можно делать проверку есть ли такой уже и просто не добавлять дубликат.
Вопрос был в удалении дубликатов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ритт
Гость
« Ответ #7 : Август 25, 2010, 18:39 »

> Но больше всего мне не нравится привязка всего к одной роли Qt::DisplayRole, когда их там может быть любое количество.

мне это тоже сразу не понравилось, но решение всё-равно кривое - не стал занудствовать)
Записан
Omg
Гость
« Ответ #8 : Январь 31, 2011, 19:59 »

Возможно, вместо второго цикла поставить проверку по списку листа и такой же каунт.
Смотрится лучше, но быстрей ли - не знаю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.