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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сравнение QStringList с другим QStringList  (Прочитано 8585 раз)
jatsuk
Гость
« : Апрель 26, 2011, 15:37 »

Есть 2 QStringList. надо сделать так, чтобы ,например присваивалась n=1, если в первом QStringList есть все строки, какие есть во втором.

Например QStringList1 вася петя маша юля
QStringList2 петя маша
n=1.

Если хотя бы 1 строки (например маши) нет в первой QStringList1, то не выполняется.

Хотел сделать через циклы, расписал на пол листка. слишком много  циклов и сравнений.
В Qt по любому есть какая нибудь функция, которая это делает, только какая Непонимающий?
Записан
madRoger
Гость
« Ответ #1 : Апрель 26, 2011, 15:54 »

можно извратиться так:
Код:
if( QStringList1.toSet().intersect(QStringList2.toSet()).count() == QStringList2.count() ) n=1;
Записан
mutineer
Гость
« Ответ #2 : Апрель 26, 2011, 16:00 »

можно извратиться так:
Код:
if( QStringList1.toSet().intersect(QStringList2.toSet()).count() == QStringList2.count() ) n=1;

Если уже приводить к QSet, то у него есть замечательный метод
Код
C++ (Qt)
bool contains ( const QSet<T> & other ) const



Еще можно перебрать все элементы первого списка и при помощи
Код
C++ (Qt)
bool contains ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
проверить есть ли они во втором. Итого один цикл
« Последнее редактирование: Апрель 26, 2011, 16:02 от mutineer » Записан
madRoger
Гость
« Ответ #3 : Апрель 26, 2011, 16:05 »

метод contains есть и у QStringList. Если им пользоваться, то преобразовывать ничего не надо. Но тогда будет цикл.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 26, 2011, 16:21 »

можно извратиться так:
Код:
if( QStringList1.toSet().intersect(QStringList2.toSet()).count() == QStringList2.count() ) n=1;
Причесать так

Код
C++ (Qt)
bool SameButReorderedLists( const QStringList & lst1, const QStringList & lst2 )
{
int count = lst1.size();
if (count != lst2.size()) return false;
return lst1.toSet().intersect(lst2.toSet()) == count;
}
 
Насчет др. постов в этой теме. Больно видеть что Вы делаете с производительностью.
Цитировать
Вам бы, товарищ младший лейтенант, не летать, а на тракторе ездить. У трактора запас прочности большой, для таких посадок вполне подходящий. Страдает машина - понимать надо.
Записан
madRoger
Гость
« Ответ #5 : Апрель 26, 2011, 16:30 »

Цитировать
Больно видеть что Вы делаете с производительностью.
А про производительность никто и не говорил. Автору темы нужно минимум кода.
Записан
SABROG
Гость
« Ответ #6 : Апрель 26, 2011, 16:33 »

qEqual() не подойдет?
Записан
mutineer
Гость
« Ответ #7 : Апрель 26, 2011, 18:01 »

Насчет др. постов в этой теме. Больно видеть что Вы делаете с производительностью.

То есть пересечение множеств и сравнение с размером это быстрее, чем contains?
Записан
mutineer
Гость
« Ответ #8 : Апрель 26, 2011, 18:02 »

метод contains есть и у QStringList. Если им пользоваться, то преобразовывать ничего не надо. Но тогда будет цикл.

Я про него и говорил
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 27, 2011, 06:16 »

То есть пересечение множеств и сравнение с размером это быстрее, чем contains?
contains для QStringList - это просто линейный перебор (как итератором или циклом for). Если контейнеры всего по 1000 элементов, то среднее число сравнений 1000 * 1000 / 2 (уже пол-миллиона). По-хорошему и intersect там не нужен. Длиннее но аккуратнее так

Код
C++ (Qt)
bool SameButReorderedLists( const QStringList & lst1, const QStringList & lst2 )
{
int count = lst1.size();
if (count != lst2.size()) return false;
QSet set1 = lst1.toSet();
for (int i = 0; i < count; ++i)
 if (!set1.contains(lst2[i])) return false;
return true;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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