crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Получение списка слов из текста
tri_d
  опции профиля:
сообщение 14.12.2014, 17:20
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 14.12.2014
Пользователь №: 4292

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте. Есть текст. Получаю список всех слов методом text.split(' '). На основании данного списка хотелось бы получить другой список следующего вида - слово1(n), слово2(m), cлово3(o). В скобках указано, сколько раз конкретное слово встречается в исходном списке. Как это можно сделать? Дайте какие-нибудь идеи
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.12.2014, 21:32
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Посчитать количество вхождений каждого слова в список.
Для хранения количества слов можно использовать QHash или QMap
http://qt-project.org/doc/qt-4.8/qmap.html#details
http://qt-project.org/doc/qt-4.8/qhash.html#details

В качестве ключей использовать слова, в качестве значений - количество вхождений.
Пройти список от начала к концу, для каждого слова, если оно есть в списке добавлять 1 к значению,
а если нет, то добавлять такой ключ со значением 1.

Потом пройти по контейнеру(QHash или QMap) и для каждого ключа составить строку, используя
http://qt-project.org/doc/qt-4.8/qstring.html#arg

Каждую такую строку добавить к результирующему списку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tri_d
  опции профиля:
сообщение 14.12.2014, 23:01
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 14.12.2014
Пользователь №: 4292

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, попробуем

Цитата(lanz @ 14.12.2014, 23:32) *
добавлять 1 к значению,


вот это не понял, как сделать

QStringList allWords = text.split(' ');

QMap<QString,int> wordsMap;
QStringList::iterator iter;

for(iter = allWords.begin();iter != allWords.end();++iter)
        {
                if(!wordsMap.contains(*iter))
                {
                    wordsMap.insert((*iter),1);
                }
                else
                {
                    wordsMap.insert((*iter),1); // надо как-то прибавить 1 к value


Цитата(tri_d @ 15.12.2014, 0:55) *
Спасибо, попробуем

Цитата(lanz @ 14.12.2014, 23:32) *
добавлять 1 к значению,


вот это не понял, как сделать

QStringList allWords = text.split(' ');

QMap<QString,int> wordsMap;
QStringList::iterator iter;

for(iter = allWords.begin();iter != allWords.end();++iter)
        {
                if(!wordsMap.contains(*iter))
                {
                    wordsMap.insert((*iter),1);
                }
                else
                {
                    wordsMap.value(*iter)++; // надо как-то прибавить 1 к value



вроде так
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tri_d
  опции профиля:
сообщение 15.12.2014, 17:49
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 14.12.2014
Пользователь №: 4292

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот код

QStringList allWords = text.split(' ');

        QMap<QString,int> wordsMap;
        QStringList::iterator iter;
        QMap<QString,int>::iterator it;

        for(iter = allWords.begin();iter != allWords.end();++iter)
        {
            if(!wordsMap.contains(*iter))
            {
                wordsMap.insert((*iter),1);
            }
        }

        for(iter = allWords.begin();iter != allWords.end();++iter)
        {
            for(it = wordsMap.begin();it != wordsMap.end();++it)
            {
                if(wordsMap.contains(*iter))
                {
                    it.value()++;
                }
            }
        }

        for(it = wordsMap.begin();it != wordsMap.end();++it)
        {
            wordsLabel->setText(wordsLabel->toPlainText() + it.key() + "(" + it.value() + "), ");
        }


Вот что получается



Цифра в скобках (it.value) почему-то одинаковая для всех слов

или так



Показываются значки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 15.12.2014, 20:10
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Так нельзя, у QString нет перегруженного оператора + для целых, поэтому тут число используется как адрес
wordsLabel->setText(wordsLabel->toPlainText() + it.key() + "(" + it.value() + "), ");

Можно так
wordsLabel->setText(wordsLabel->toPlainText() + it.key() + "(" + QString::number(it.value()) + "), ");

Первый ваш вариант был правильный
for(iter = allWords.begin();iter != allWords.end();++iter)
        {
                if(!wordsMap.contains(*iter))
                {
                    wordsMap.insert((*iter),1);
                }
                else
                {
                    wordsMap[*iter]++; // используйте оператор []
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tri_d
  опции профиля:
сообщение 15.12.2014, 22:17
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 14.12.2014
Пользователь №: 4292

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вроде разобрался. Оказалось, вот как надо -

        QStringList allWords = text.split(' ');  
        QMap<QString,int> wordsMap;

        QStringList::const_iterator iter;
        QMap<QString,int>::iterator it;

        for(iter = allWords.constBegin();iter != allWords.constEnd();++iter)
        {
            if(!wordsMap.contains(*iter))
            {
                wordsMap.insert((*iter),1);
            }
        }

        for(iter = allWords.constBegin();iter != allWords.constEnd();++iter)
        {
            for(it = wordsMap.begin();it != wordsMap.end();++it)
            {
                if(it.key() == (*iter))  // если ключ в карте соответствует слову из списка, то
                {
                    it.value()++; // значение ключа увеличиваем на 1
                }
            }
        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 15.12.2014, 23:11
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Вместо этого цикла
            for(it = wordsMap.begin();it != wordsMap.end();++it)
            {
                if(it.key() == (*iter))  // если ключ в карте соответствует слову из списка, то
                {
                    it.value()++; // значение ключа увеличиваем на 1
                }
            }

Можно использовать
if(wordsMap.contains(*iter)) wordsMap[*iter]++

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.5.2024, 0:49