Russian Qt Forum
Апреля 04, 2025, 03:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пример удаления повторяющихся элементов в QListWidget  (Прочитано 10656 раз)
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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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.032 секунд. Запросов: 21.