Russian Qt Forum

Qt => Вопросы новичков => Тема начата: jatsuk от Апрель 26, 2011, 15:37



Название: Сравнение QStringList с другим QStringList
Отправлено: jatsuk от Апрель 26, 2011, 15:37
Есть 2 QStringList. надо сделать так, чтобы ,например присваивалась n=1, если в первом QStringList есть все строки, какие есть во втором.

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

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

Хотел сделать через циклы, расписал на пол листка. слишком много  циклов и сравнений.
В Qt по любому есть какая нибудь функция, которая это делает, только какая ????


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: madRoger от Апрель 26, 2011, 15:54
можно извратиться так:
Код:
if( QStringList1.toSet().intersect(QStringList2.toSet()).count() == QStringList2.count() ) n=1;


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: mutineer от Апрель 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
проверить есть ли они во втором. Итого один цикл


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: madRoger от Апрель 26, 2011, 16:05
метод contains есть и у QStringList. Если им пользоваться, то преобразовывать ничего не надо. Но тогда будет цикл.


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: Igors от Апрель 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;
}
 
Насчет др. постов в этой теме. Больно видеть что Вы делаете с производительностью.
Цитировать
Вам бы, товарищ младший лейтенант, не летать, а на тракторе ездить. У трактора запас прочности большой, для таких посадок вполне подходящий. Страдает машина - понимать надо.


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: madRoger от Апрель 26, 2011, 16:30
Цитировать
Больно видеть что Вы делаете с производительностью.
А про производительность никто и не говорил. Автору темы нужно минимум кода.


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: SABROG от Апрель 26, 2011, 16:33
qEqual() не подойдет?


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: mutineer от Апрель 26, 2011, 18:01
Насчет др. постов в этой теме. Больно видеть что Вы делаете с производительностью.

То есть пересечение множеств и сравнение с размером это быстрее, чем contains?


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: mutineer от Апрель 26, 2011, 18:02
метод contains есть и у QStringList. Если им пользоваться, то преобразовывать ничего не надо. Но тогда будет цикл.

Я про него и говорил


Название: Re: Сравнение QStringList с другим QStringList
Отправлено: Igors от Апрель 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;
}