Russian Qt Forum

Qt => Общие вопросы => Тема начата: Astrologer от Сентябрь 14, 2010, 12:16



Название: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 12:16
Всем привет. У меня такая задача - есть QStringlist i1, в котором куча имен, содержащих префикс d_ и префикс s_ (например i1 = {d_table1, s_table1, d_re, s_re, ....}). Мне необходимо разбить этот  лист на два QStringList'a, чтобы в одном были d_имена,  а в другом s_имена. Наверное можно к ак то сделать с QRegExp, только я с ним не работал. Кто нибудь подскажите пожалуйста.


Название: Re: QStringList
Отправлено: Sancho_s_rancho от Сентябрь 14, 2010, 12:30
Всем привет. У меня такая задача - есть QStringlist i1, в котором куча имен, содержащих префикс d_ и префикс s_ (например i1 = {d_table1, s_table1, d_re, s_re, ....}). Мне необходимо разбить этот  лист на два QStringList'a, чтобы в одном были d_имена,  а в другом s_имена. Наверное можно к ак то сделать с QRegExp, только я с ним не работал. Кто нибудь подскажите пожалуйста.
А почему надо все усложнять?
Пишешь for (по вкусу for_each) и для каждого элемента листа проверяешь первый символ. Если  d - то сюда, если s -  то туда.


Название: Re: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 12:32
Код:
for (int i = 0; i < i1.count() - 1; i++)
    {
        QString string = i1[i];
        if (string.contains("s_")) s_tables.push_back(string);
        if (string.contains("d_")) d_tables.push_back(string);
    }


Название: Re: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 12:33
Спасибо)) видимо перегрелся чуток))


Название: Re: QStringList
Отправлено: BRE от Сентябрь 14, 2010, 12:33
Посмотри на QStringList::filter( ... ).


Название: Re: QStringList
Отправлено: Kolobok от Сентябрь 14, 2010, 12:37
С QStringList::filter() придется два прохода делать. Но если это неважно...

QRegExp( "^d_*" )


Название: Re: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 12:45
Спасибо большое всем!!


Название: Re: QStringList
Отправлено: m_ax от Сентябрь 14, 2010, 12:51
Код
C++ (Qt)
foreach (QString str, i1) {
   if (str.contains("s_"))
       s_table << str;
   else
       d_table << str;
}
 


Название: Re: QStringList
Отправлено: Kolobok от Сентябрь 14, 2010, 12:53
"d_s_" ???


Название: Re: QStringList
Отправлено: m_ax от Сентябрь 14, 2010, 13:01
Цитировать
"d_s_"
тогда так:
Код
C++ (Qt)
foreach (QString str, i1) {
   if (str[0]=='s')
       s_table << str;
   else
       d_table << str;
}
 


Название: Re: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 13:02
Код
C++ (Qt)
foreach (QString str, i1) {
   if (str.contains("s_"))
       s_table << str;
   else
       d_table << str;
}
 

Так быстрее?) К тому же, если имя, отличное от d_* или s_*, занесется в d_table.


Название: Re: QStringList
Отправлено: m_ax от Сентябрь 14, 2010, 13:08
Цитировать
Так быстрее?) К тому же, если имя, отличное от d_* или s_*, занесется в d_table.
Ну если вопрос ставился изначально, что все имена начинаются либо с s либо с d, то быстрее)
Лучше конечно сравнивать с первым символом.

Цитировать
for (int i = 0; i < i1.count() - 1; i++)
    {
        QString string = i1;
        if (string.contains("s_")) s_tables.push_back(string);
        if (string.contains("d_")) d_tables.push_back(string);
    }

А в Вашем варианте вы не до конца проходите список. И более того, если у вас прошло первое условие:
 if (string.contains("s_")) s_tables.push_back(string);
то всё равно повторно будет произведён поиск на "d_". Зачем? 

Код
C++ (Qt)
foreach (QString str, i1) {
   if (str[0]=='s')
       s_table << str;
   else if (str[0]=='d')
       d_table << str;
}
 


Название: Re: QStringList
Отправлено: Astrologer от Сентябрь 14, 2010, 13:11
Да,согласен. Ваш вариант мне больше нравится. Его и оставлю. Исправил на
Код:
for (int i = 0; i < all.count(); i++) 


Название: Re: QStringList
Отправлено: Kolobok от Сентябрь 14, 2010, 13:42
В классе QString есть метод startsWith(...). Он и работает быстрее чем contains(...), и код станет читабельнее.