Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: merke от Август 24, 2010, 09:36



Название: Пример удаления повторяющихся элементов в QListWidget
Отправлено: 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);
                }
            }
        }

Возможно реализация не самая эффективная. Жду более оптимизированных вариантов.


Название: Re: Пример удаления повторяющихся элементо
Отправлено: Пантер от Август 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--;
   }
 }
}
 
Не сильно вдавался, но так лучше.


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: SABROG от Август 24, 2010, 20:24
А это точно лучше, сравнивать итем самим с собою?

Код
C++ (Qt)
listWidget->item (i)->text () == listWidget->item (i)->text ()
 


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: kobra от Август 24, 2010, 23:21
этот пример дает O(N2). Второй способ что здесь навели немного лучше если не считать маленькой опечатки. Если можна список посортировать то тогда удаления елементов можна сделать за один проход.


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: Пантер от Август 25, 2010, 06:25
SABROG, очепятался. Сейчас подправлю.


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: SABROG от Август 25, 2010, 08:14
На самом деле все как-то не так. Вместо того, чтобы удалять лишние элементы из списка, можно делать проверку есть ли такой уже и просто не добавлять дубликат. Но больше всего мне не нравится привязка всего к одной роли Qt::DisplayRole, когда их там может быть любое количество.


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: Пантер от Август 25, 2010, 11:22
На самом деле все как-то не так. Вместо того, чтобы удалять лишние элементы из списка, можно делать проверку есть ли такой уже и просто не добавлять дубликат.
Вопрос был в удалении дубликатов.


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: ритт от Август 25, 2010, 18:39
> Но больше всего мне не нравится привязка всего к одной роли Qt::DisplayRole, когда их там может быть любое количество.

мне это тоже сразу не понравилось, но решение всё-равно кривое - не стал занудствовать)


Название: Re: Пример удаления повторяющихся элементов в QListWidget
Отправлено: Omg от Январь 31, 2011, 19:59
Возможно, вместо второго цикла поставить проверку по списку листа и такой же каунт.
Смотрится лучше, но быстрей ли - не знаю.