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

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

Страниц: 1 ... 12 13 [14] 15 16 ... 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 154726 раз)
Spark
Гость
« Ответ #195 : Август 04, 2013, 05:48 »

Wildcard уже в общем то выходит за рамки стандартных настроек программ подобного класса. Возможно стоит добавить максимальное число повторений.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #196 : Август 04, 2013, 06:37 »

Код
C++ (Qt)
   // ОСТАВЛЯЕМ ТЕКСТ
   if(cfg.preferences.langStatSort == 0)listFull = originalText.toLower().split(QRegExp("[\\s\\W\\d_]+"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ АНГЛИЙКИЙ
   if(cfg.preferences.langStatSort == 1)listFull = originalText.toLower().split(QRegExp("[^a-z]+"),QString::SkipEmptyParts);
 
   // ОСТАВЛЯЕМ РУССКИЙ
   if(cfg.preferences.langStatSort == 2)listFull = originalText.toLower().split(QRegExp(QString::fromUtf8("[^а-яё]+")),QString::SkipEmptyParts);
 
А Вас не смущает что масса текста в 3 экземплярах? ("не ленивый программист")
Код
C++ (Qt)
const QString mask[3] = {
QString("[\\s\\W\\d_]+"),
QString("[^a-z]+"),
QString::fromUtf8("[^а-яё]+"),
};
QRegExp rexp(mask[cfg.preferences.langStatSort]);
listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
 
Записан
Spark
Гость
« Ответ #197 : Август 04, 2013, 07:21 »

Смущает Улыбающийся. Но знать бы где соломку подстелить?
Спасибо.
Здесь точно 3, а не 2?
const QString mask[3]

А по поводу табуляции есть совет? http://www.prog.org.ru/index.php?topic=25332.msg181750#msg181750
Как подравнять колоночки?
« Последнее редактирование: Август 04, 2013, 07:23 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #198 : Август 04, 2013, 07:30 »

Здесь точно 3, а не 2?
const QString mask[3]
Элементов 3 (mask[0], mask[1], mask[2]). Ну что же Вы такие пузыри пускаете  Плачущий

А по поводу табуляции есть совет? http://www.prog.org.ru/index.php?topic=25332.msg181750#msg181750
Как подравнять колоночки?
Сделвть таблицу (в Qt легко)
Записан
Spark
Гость
« Ответ #199 : Август 04, 2013, 07:42 »

Сделвть таблицу (в Qt легко)
Ну это таблицу, до нее дело дойдет. А вот сейчас я зажат в рамках виджета вывода информации построчно. В принципе нормально в две колонки получается. Наглядно. Но вот слова превышающие длину табуляции, выбиваются из колеи:

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

Сообщений: 11445


Просмотр профиля
« Ответ #200 : Август 04, 2013, 08:16 »

Хотелось бы просто иметь возможность отрегулировать табуляцию, как это возможно в некоторых редакторах.
Нет смысла тратить время на ущербное/временное решение, тем более если нормальную таблицу сделать - ну минут 10, т.е. просто съесть плюшку   Улыбающийся
Записан
Spark
Гость
« Ответ #201 : Август 04, 2013, 09:04 »

Хотелось бы просто иметь возможность отрегулировать табуляцию, как это возможно в некоторых редакторах.
Нет смысла тратить время на ущербное/временное решение, тем более если нормальную таблицу сделать - ну минут 10, т.е. просто съесть плюшку   Улыбающийся
Ok! I agree with you.
Я подумаю. И конечно, для меня это не будет 10 минут. Во-первых, нет опыта. Во-вторых, надо интегрировать это дело как то в готовую программу. Модули для которой я пишу.
Если бы надо было просто составить таблицу, то думаю справился бы достаточно быстро.

Но если вас не затруднит, простенький пример как вывести текущую информацию (слово - частота) в простейшую табличку в две колонки. Конечно, сам бы смог выдать очередной код, но не хочется повторять типичных ошибок.
Ну или с чего начать?
« Последнее редактирование: Август 04, 2013, 09:07 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #202 : Август 04, 2013, 10:39 »

Но если вас не затруднит, простенький пример как вывести текущую информацию (слово - частота) в простейшую табличку в две колонки. Конечно, сам бы смог выдать очередной код, но не хочется повторять типичных ошибок.
Ну или с чего начать?
Не то чтобы затруднит, но если Вы откроете QTableView и перепишете оттудв - будет намного быстрее  Улыбающийся
Записан
Spark
Гость
« Ответ #203 : Август 04, 2013, 11:34 »

Не то чтобы затруднит, но если Вы откроете QTableView и перепишете оттудв - будет намного быстрее  Улыбающийся
Все понял. Спасибо.
В ближайшем будущем попробую переделать.
« Последнее редактирование: Август 04, 2013, 11:37 от Spark » Записан
Spark
Гость
« Ответ #204 : Август 04, 2013, 11:38 »

Можно ли еще, что сделать, уменьшить код, оптимизировать, ускорить в рамках этой функции и QT?:
Код
C++ (Qt)
void MainWindow::wordStat()
{
   QTime tm;
   tm.start();
 
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
   QString addZero;
   QStringList listFull;
   QStringList frequencyList;
 
   qDebug() << "Reade Data: " << tm.elapsed();
   tm.start();
 
   textory.clear();
   textory.enableAdd( true );
 
   // ОСТАВЛЯЕМ ВЕСЬ ТЕКСТ/АНГЛИЙСКИЙ/РУССКИЙ
   const QString mask[3] = {
    QString("[\\s\\W\\d_]+"),
    QString("[^a-z]+"),
    QString::fromUtf8("[^а-яё]+"),
   };
   QRegExp rexp(mask[cfg.preferences.langStatSort]);
   listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
 
   qDebug() << "Data split: " << tm.elapsed();
   tm.start();
 
   // ПОСТРОЕНИЕ СПИСКА
   QRegExp rx(muRegExp);
   rx.setPatternSyntax(QRegExp::Wildcard);
 
   QHash<QString, int> frequencyHash;
   foreach (QString s, listFull) ++frequencyHash[s];
   frequencyList.reserve(listFull.size());
   foreach (QString s, listFull) {
       if(s.size() < cfg.preferences.minSizeWord || s.size() > cfg.preferences.maxSizeWord )continue;
       if(!muRegExp.isEmpty() && !rx.exactMatch(s))continue;
       int & num = frequencyHash[s];
       if(num < 0) continue;
       if(num >= cfg.preferences.minRepeats ) {
           if(cfg.preferences.typeOfSort == 2)frequencyList.prepend(s + '\t' + QString::number(long(num)));
           if(cfg.preferences.typeOfSort == 1)frequencyList.prepend(s + '\t' + QString::number(long(num)));
           if(cfg.preferences.typeOfSort == 0) {
               addZero = QString::number(long(num)).rightJustified(6, '0');
               frequencyList.prepend(addZero + s + '\t' + QString::number(long(num)));
           }
       }
       num = -num;
   }
 
   qDebug() << "Count: " << tm.elapsed();
   tm.start();
 
   if(cfg.preferences.typeOfSort != 2)qSort(frequencyList);
 
   // ВЫВОД СПИСКА
   qDebug() << "Data sort: " << tm.elapsed();
   tm.start();
 
   if(cfg.preferences.typeOfSort == 0 || cfg.preferences.typeOfSort == 2) {
       foreach (QString itm, frequencyList) {
           if(cfg.preferences.typeOfSort == 0)itm.remove(0,6);
           textory.addItem( Textory::Item( 1, itm ) );
       }
   }
 
   if(cfg.preferences.typeOfSort == 1) {
       QListIterator<QString>itm(frequencyList);
       itm.toBack();
       while (itm.hasPrevious())
           textory.addItem( Textory::Item( 1, itm.previous() ) );
   }
 
   qDebug() << "Out list: " << tm.elapsed();
   tm.start();
 
   cfg.textoryName = "Frequency list (" + QString::number(long(listFull.size())) + ")";
   ui.textoryPaneWidget->getTextoryLabel().setText( cfg.textoryName );
 
   qDebug() << "Write name: " << tm.elapsed();
}
« Последнее редактирование: Август 04, 2013, 11:50 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #205 : Август 04, 2013, 14:08 »

Код
C++ (Qt)
           if(cfg.preferences.typeOfSort == 2)frequencyList.prepend(s + '\t' + QString::number(long(num)));
           if(cfg.preferences.typeOfSort == 1)frequencyList.prepend(s + '\t' + QString::number(long(num)));
           if(cfg.preferences.typeOfSort == 0) {
}
Если с пробелами не наведете порядок - больше не отвечу  Улыбающийся Здесь лучше так
Код
C++ (Qt)
// в начале
const MyPref & pref = cfg.preferences;   // MyPref = тот тип что cfg.preferences
enum {
sort_None = 0,
sort_Freq = 1,
sort_Crazy = 2,   // даете имена по смыслу, этл для примера
};
...
if  (pref.typeOfSort != sort_None)
frequencyList.prepend(s + '\t' + QString::number(long(num)));
else {
...
 
Ну и научитесь нормально сортировку делать, это несложно

Записан
Spark
Гость
« Ответ #206 : Август 04, 2013, 16:13 »

Если с пробелами не наведете порядок - больше не отвечу  Улыбающийся Здесь лучше так
Набрался с чужого кода. Если не вы, то ктож меня теперь научит правилам хорошего кода Улыбающийся.
Не ясно для чего это?:
Код
C++ (Qt)
enum {
sort_None = 0,
sort_Freq = 1,
sort_Crazy = 2,   // даете имена по смыслу, этл для примера
};
Компактнее не становится. Только для того, кто после меня будет ковырять код? Просто ноль вставил.
Подровнял:
Код
C++ (Qt)
void MainWindow::wordStat()
{
   QTime tm;
   tm.start();
 
   const Config::Preferences & pref = cfg.preferences;
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
   QString addZero;
   QStringList listFull;
   QStringList frequencyList;
 
   qDebug() << "Reade Data: " << tm.elapsed();
   tm.start();
 
   textory.clear();
   textory.enableAdd( true );
 
   // ОСТАВЛЯЕМ ВЕСЬ ТЕКСТ/АНГЛИЙСКИЙ/РУССКИЙ
   const QString mask[3] = {
       QString("[\\s\\W\\d_]+"),
       QString("[^a-z]+"),
       QString::fromUtf8("[^а-яё]+"),
   };
   QRegExp rexp(mask[pref.langStatSort]);
   listFull = originalText.toLower().split(rexp, QString::SkipEmptyParts);
 
   qDebug() << "Data split: " << tm.elapsed();
   tm.start();
 
   // ПОСТРОЕНИЕ СПИСКА
   QRegExp rx(muRegExp);
   rx.setPatternSyntax(QRegExp::Wildcard);
 
   QHash<QString, int> frequencyHash;
   foreach (QString s, listFull) ++frequencyHash[s];
   frequencyList.reserve(listFull.size());
   foreach (QString s, listFull) {
       if (s.size() < pref.minSizeWord || s.size() > pref.maxSizeWord )continue;
       if (!muRegExp.isEmpty() && !rx.exactMatch(s))continue;
       int & num = frequencyHash[s];
       if (num < 0) continue;
       if (num >= pref.minRepeats ) {
           if  (pref.typeOfSort != 0)
               frequencyList.prepend(s + '\t' + QString::number(long(num)));
           else {
               addZero = QString::number(long(num)).rightJustified(6, '0');
               frequencyList.prepend(addZero + s + '\t' + QString::number(long(num)));
           }
       }
       num = -num;
   }
 
   qDebug() << "Count: " << tm.elapsed();
   tm.start();
 
   if (pref.typeOfSort != 2)qSort(frequencyList);
 
   // ВЫВОД СПИСКА
   qDebug() << "Data sort: " << tm.elapsed();
   tm.start();
 
   if (pref.typeOfSort == 0 || pref.typeOfSort == 2) {
       foreach (QString itm, frequencyList) {
           if(pref.typeOfSort == 0)itm.remove(0,6);
           textory.addItem( Textory::Item( 1, itm ) );
       }
   }
 
   if (pref.typeOfSort == 1) {
       QListIterator<QString>itm(frequencyList);
       itm.toBack();
       while (itm.hasPrevious())
           textory.addItem( Textory::Item( 1, itm.previous() ) );
   }
 
   qDebug() << "Out list: " << tm.elapsed();
   tm.start();
 
   cfg.textoryName = "Frequency list (" + QString::number(long(listFull.size())) + ")";
   ui.textoryPaneWidget->getTextoryLabel().setText( cfg.textoryName );
 
   qDebug() << "Write name: " << tm.elapsed();
}

Ну и научитесь нормально сортировку делать, это несложно
Поясните для меня непутевого, что имеете ввиду? Сразу постараюсь учесть.
« Последнее редактирование: Август 04, 2013, 16:26 от Spark » Записан
Spark
Гость
« Ответ #207 : Август 04, 2013, 16:19 »

Устал на самом деле (да и ночь у нас уже), но попутно накропал дополнительную функцию. Немного нового и поверхностно ознакомился и честно признаюсь, что на половину делал опираясь на полученные знания, а наполовину методом тыка:
Код
C++ (Qt)
void MainWindow::textoryInBuffer()
{
   QStringList textoryStrings;
 
   QString line;
   QList< Textory::Item > const & items = textory.getItems();
 
   QList< Textory::Item >::const_iterator i;
   for ( i = items.constBegin(); i != items.constEnd(); ++i ){
       line = i->word.toUtf8();
       textoryStrings.append(line);
   }
   QApplication::clipboard()->setText( textoryStrings.join( QString::fromLatin1( "\n" ) ) );
}
Работает, но технически все ли правильно?
« Последнее редактирование: Август 04, 2013, 16:23 от Spark » Записан
Spark
Гость
« Ответ #208 : Август 04, 2013, 16:22 »

И по поводу стиля. Опираюсь я действительно на чужой код и соответственно стилистика заимствована. Где еще у меня не красиво?
Записан
Majestio
Гость
« Ответ #209 : Август 04, 2013, 16:31 »

Не то чтобы затруднит, но если Вы откроете QTableView и перепишете оттудв - будет намного быстрее  Улыбающийся
Все понял. Спасибо.
В ближайшем будущем попробую переделать.

В этом посте, в прикрепленном архиве я набрасывал примерчик - там все это работает с таблицей. Можете не долго думая взять за основу и не мучаться с табуляциями. За одно мимоходом ознакомитесь с концепцией модель-представление - пригодиться в будущем.
Записан
Страниц: 1 ... 12 13 [14] 15 16 ... 18   Вверх
  Печать  
 
Перейти в:  


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