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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подсчет вхождения слова в текст  (Прочитано 3613 раз)
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;
}
Беда в том, что она считает и вхождения подстрок в слова. Например если в тексте встретилось слово "за", то оно потом посчитает и "глаЗА", "тормоЗА" и прочие. Что можно сделать, чтоб оно считало только слова целиком? За ранее благодарен.
Записан
Serr500
Гость
« Ответ #1 : Январь 22, 2014, 20:15 »

Вы ещё скажите, что эта херня компилируется...
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Январь 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 ) Подмигивающий
« Последнее редактирование: Январь 22, 2014, 20:36 от gil9red » Записан

Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Январь 22, 2014, 20:53 »

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

Зачем?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 22, 2014, 21:26 »

    QStringList list = allText.split(QRegExp("\\W+"), QString::SkipEmptyParts);
Во как хорошо - написал строку, и все сделано. А какой ценой - ну зачем об этом думать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Январь 22, 2014, 21:34 »

можно регуляркой \b<слово>\b
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gertvaQT
Гость
« Ответ #6 : Январь 22, 2014, 21:41 »

gil9red, Огромное спасибо, все заработало
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 22, 2014, 22:48 »

gil9red, Огромное спасибо, все заработало
Да на здоровье Смеющийся

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

Зачем?

При создании карты в кучи, первый вариант (с map[ word ]++), не хотел компилироваться Улыбающийся
« Последнее редактирование: Январь 22, 2014, 22:50 от gil9red » Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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