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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStringList  (Прочитано 6036 раз)
Astrologer
Гость
« : Сентябрь 14, 2010, 12:16 »

Всем привет. У меня такая задача - есть QStringlist i1, в котором куча имен, содержащих префикс d_ и префикс s_ (например i1 = {d_table1, s_table1, d_re, s_re, ....}). Мне необходимо разбить этот  лист на два QStringList'a, чтобы в одном были d_имена,  а в другом s_имена. Наверное можно к ак то сделать с QRegExp, только я с ним не работал. Кто нибудь подскажите пожалуйста.
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Сентябрь 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 -  то туда.
Записан
Astrologer
Гость
« Ответ #2 : Сентябрь 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);
    }
Записан
Astrologer
Гость
« Ответ #3 : Сентябрь 14, 2010, 12:33 »

Спасибо)) видимо перегрелся чуток))
Записан
BRE
Гость
« Ответ #4 : Сентябрь 14, 2010, 12:33 »

Посмотри на QStringList::filter( ... ).
Записан
Kolobok
Гость
« Ответ #5 : Сентябрь 14, 2010, 12:37 »

С QStringList::filter() придется два прохода делать. Но если это неважно...

QRegExp( "^d_*" )
Записан
Astrologer
Гость
« Ответ #6 : Сентябрь 14, 2010, 12:45 »

Спасибо большое всем!!
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Сентябрь 14, 2010, 12:51 »

Код
C++ (Qt)
foreach (QString str, i1) {
   if (str.contains("s_"))
       s_table << str;
   else
       d_table << str;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Kolobok
Гость
« Ответ #8 : Сентябрь 14, 2010, 12:53 »

"d_s_" Непонимающий
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #9 : Сентябрь 14, 2010, 13:01 »

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Astrologer
Гость
« Ответ #10 : Сентябрь 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.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #11 : Сентябрь 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;
}
 
« Последнее редактирование: Сентябрь 14, 2010, 13:12 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Astrologer
Гость
« Ответ #12 : Сентябрь 14, 2010, 13:11 »

Да,согласен. Ваш вариант мне больше нравится. Его и оставлю. Исправил на
Код:
for (int i = 0; i < all.count(); i++) 
« Последнее редактирование: Сентябрь 14, 2010, 13:13 от Astrologer » Записан
Kolobok
Гость
« Ответ #13 : Сентябрь 14, 2010, 13:42 »

В классе QString есть метод startsWith(...). Он и работает быстрее чем contains(...), и код станет читабельнее.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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