Russian Qt Forum

Qt => Вопросы новичков => Тема начата: gertvaQT от Январь 22, 2014, 19:58



Название: Подсчет вхождения слова в текст
Отправлено: gertvaQT от Январь 22, 2014, 19:58
Здравствуйте. В QT новичек. Написал следующую программу для подсчета вхождения слова в текст
QMap<QString, int>* calculation::calculate(QString allText)
{

    QMap<QString, int> *map = new QMap<QString, int>();
    QStringList list = allText.split(QRegExp("\\W+"), QString::SkipEmptyParts);
   
    for (int i=0; i<list.size();i++)
    {
        int numm = allText.count(list,Qt::CaseInsensitive);
       map->insert(list, numm);
    }
    return map;
}
Беда в том, что она считает и вхождения подстрок в слова. Например если в тексте встретилось слово "за", то оно потом посчитает и "глаЗА", "тормоЗА" и прочие. Что можно сделать, чтоб оно считало только слова целиком? За ранее благодарен.


Название: Re: Подсчет вхождения слова в текст
Отправлено: Serr500 от Январь 22, 2014, 20:15
Вы ещё скажите, что эта херня компилируется...


Название: Re: Подсчет вхождения слова в текст
Отправлено: gil9red от Январь 22, 2014, 20:29
Вот накидал:
Код
C++ (Qt)
QMap < QString, int > calculate( const QString & text)
{
   QMap < QString, int > map;
 
   QTextDocument document( text );
   QTextCursor textCursor;
   do
   {
       textCursor = document.find( QRegExp( "\\w+" ), textCursor, QTextDocument::FindWholeWords );
       if ( textCursor.hasSelection() )
       {
           QString word = textCursor.selectedText();
           map[ word ]++;
       }
 
   } while ( !textCursor.isNull() );
 
   return map;
}
 

ЗЫ. ваш код действительно некомпилируемый :)
Если все-таки будете выделять память под карту, тогда строку map[ word ]++ замените на map->insert( word, map->value( word ) + 1 ) ;)


Название: Re: Подсчет вхождения слова в текст
Отправлено: Alex Custov от Январь 22, 2014, 20:53
Если все-таки будете выделять память под карту, тогда строку map[ word ]++ замените на map->insert( word, map->value( word ) + 1 ) ;)

Зачем?


Название: Re: Подсчет вхождения слова в текст
Отправлено: Igors от Январь 22, 2014, 21:26
    QStringList list = allText.split(QRegExp("\\W+"), QString::SkipEmptyParts);
Во как хорошо - написал строку, и все сделано. А какой ценой - ну зачем об этом думать?


Название: Re: Подсчет вхождения слова в текст
Отправлено: kambala от Январь 22, 2014, 21:34
можно регуляркой \b<слово>\b


Название: Re: Подсчет вхождения слова в текст
Отправлено: gertvaQT от Январь 22, 2014, 21:41
gil9red, Огромное спасибо, все заработало


Название: Re: Подсчет вхождения слова в текст
Отправлено: gil9red от Январь 22, 2014, 22:48
gil9red, Огромное спасибо, все заработало
Да на здоровье ;D

Если все-таки будете выделять память под карту, тогда строку map[ word ]++ замените на map->insert( word, map->value( word ) + 1 ) ;)

Зачем?

При создании карты в кучи, первый вариант (с map[ word ]++), не хотел компилироваться :)