新手求教 文本处理问题

csdnbuku 2015-08-19 10:01:56
简单的说就是对textEdit中的文字统计字频,就是出现的次数,然后从大到小排序。
我只会统计次数,排序部分没思路,也只会单纯的对数字大小排序。

void Test::zpSlot(){



QString str=ui->textEdit->toPlainText();
QString str2;
QString str3;


//统计字频
for(int i=0;i<str.length();i++){
int s=str.count(str[i]);
str2.append(str[i]+QString::number(s)+"\n");


}



QStringList list = str2.split("\n");
//删除重复行
for(int i=0;i<list.count();i++){

if(!str3.contains(list[i])){
str3+=list[i];
str3+='\n';

}
}


ui->textEdit->setPlainText(str3);
}



以上代码执行后,
比如“的的好是人总总总一不不不不不”
处理后变成了:
的2
好1
是1
人1
总3
一1
不5

而我要的结果:
不5
总3
的2
好1
是1
人1
一1

求大神们提供下排序部分的代码。感谢!

只有40积分了,怎么积分越用越少。。。。。
...全文
280 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnbuku 2015-09-06
  • 打赏
  • 举报
回复
引用 14 楼 sourire_will 的回复:
粗心大意了,下面代码满足你的需求:

#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qStableSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    QListIterator<QPair<QString, int> > iter2(list);
    while (iter2.hasNext())
    {
        pair = iter2.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
下面是打印: before sort: "好" 1 "不" 5 "是" 1 "的" 2 "人" 1 "总" 3 "一" 1 after sort: "不" 5 "总" 3 "的" 2 "好" 1 "是" 1 "人" 1 "一" 1
非常感谢!
csdnbuku 2015-08-29
  • 打赏
  • 举报
回复
引用 12 楼 sourire_will 的回复:
抱歉,好久没来了,下面是代码:
#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    if (pair1.second == pair2.second)
    {
        return (pair1.first > pair2.first);
    }
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    iter.toFront();
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
这是打印的结果: before sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 after sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 你是怎么给"好"和"是"排序的?
引用 12 楼 sourire_will 的回复:
抱歉,好久没来了,下面是代码:
#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    if (pair1.second == pair2.second)
    {
        return (pair1.first > pair2.first);
    }
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    iter.toFront();
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
这是打印的结果: before sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 after sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 你是怎么给"好"和"是"排序的?
引用 12 楼 sourire_will 的回复:
抱歉,好久没来了,下面是代码:
#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    if (pair1.second == pair2.second)
    {
        return (pair1.first > pair2.first);
    }
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    iter.toFront();
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
这是打印的结果: before sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 after sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 你是怎么给"好"和"是"排序的?
我的目的是这样的:比如在textEdit中有文本:是好的不的是的 经过处理后结果: 的3 是2 好1 不1 出现次数多的排在前面,出现次数一样多,就按照原文本的先后顺序。
sourire_will 2015-08-29
  • 打赏
  • 举报
回复
粗心大意了,下面代码满足你的需求:

#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qStableSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    QListIterator<QPair<QString, int> > iter2(list);
    while (iter2.hasNext())
    {
        pair = iter2.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
下面是打印: before sort: "好" 1 "不" 5 "是" 1 "的" 2 "人" 1 "总" 3 "一" 1 after sort: "不" 5 "总" 3 "的" 2 "好" 1 "是" 1 "人" 1 "一" 1
sourire_will 2015-08-28
  • 打赏
  • 举报
回复
抱歉,好久没来了,下面是代码:
#include <QtGui>

bool moreThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2)
{
    if (pair1.second == pair2.second)
    {
        return (pair1.first > pair2.first);
    }
    return pair1.second > pair2.second;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("SYSTEM"));

    QList<QPair<QString,int> > list;
    list.append(QPair<QString, int>("不", 5));
    list.append(QPair<QString, int>("的", 2));
    list.append(QPair<QString, int>("总", 3));
    list.append(QPair<QString, int>("好", 1));
    list.append(QPair<QString, int>("是", 1));
    list.append(QPair<QString, int>("人", 1));
    list.append(QPair<QString, int>("一", 1));

    qDebug("before sort: ");
    QListIterator<QPair<QString, int> > iter(list);
    QPair<QString, int> pair;
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    qSort(list.begin(), list.end(), moreThan);

    qDebug("after sort: ");
    iter.toFront();
    while (iter.hasNext())
    {
        pair = iter.next();
        qDebug() << pair.first << " " << pair.second;
    }

    return a.exec();
}
这是打印的结果: before sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 after sort: "不" 5 "的" 2 "总" 3 "好" 1 "是" 1 "人" 1 "一" 1 你是怎么给"好"和"是"排序的?
sourire_will 2015-08-28
  • 打赏
  • 举报
回复
把pair改成pair2就好了
csdnbuku 2015-08-23
  • 打赏
  • 举报
回复
引用 7 楼 sourire_will 的回复:

bool lessThan(const QPair &pair1, const QPair &pair2)
{
    if (pair1.second == pair2.second) 
    {
        return (pair1.first < pair.first);
    }
    return pair1.second < pair2.second;
}
void test::zpSlot(){
 
 
 
    QString str=ui->textEdit->toPlainText();
 
    QList<QPair<QString,int> > list;
  
    //统计字频
    for(int i=0;i<str.length();i++){
         int s=str.count(str[i]);
         list.append(QPair(str[i],s));
         qDebug()<<str[i]<<s;
     }
 
        qDebug()<<"-------"<<endl;
 
    // 从map中获取每一个键
    foreach(QCharRef str,map.keys())
        qDebug() << str << " : " << map.value(str);
 
 
     qSort(list.begin(), list.end(), lessThan);
}
谢谢 改成bool test::lessThan(const QPair &pair1, const QPair &pair2) 然后在private中 bool lessThan(const QPair &pair1, const QPair &pair2);
csdnbuku 2015-08-23
  • 打赏
  • 举报
回复
引用 9 楼 sourire_will 的回复:
应该是 bool lessThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2) { if (pair1.second == pair2.second) { return (pair1.first < pair.first); } return pair1.second < pair2.second; }
大神你好,又报错了。不知道什么原因。可否提供个完整工程文件。已粉,谢谢帮忙!
sourire_will 2015-08-23
  • 打赏
  • 举报
回复
应该是 bool lessThan(const QPair<QString, int> &pair1, const QPair<QString, int> &pair2) { if (pair1.second == pair2.second) { return (pair1.first < pair.first); } return pair1.second < pair2.second; }
sourire_will 2015-08-22
  • 打赏
  • 举报
回复

bool lessThan(const QPair &pair1, const QPair &pair2)
{
    if (pair1.second == pair2.second) 
    {
        return (pair1.first < pair.first);
    }
    return pair1.second < pair2.second;
}
void test::zpSlot(){
 
 
 
    QString str=ui->textEdit->toPlainText();
 
    QList<QPair<QString,int> > list;
  
    //统计字频
    for(int i=0;i<str.length();i++){
         int s=str.count(str[i]);
         list.append(QPair(str[i],s));
         qDebug()<<str[i]<<s;
     }
 
        qDebug()<<"-------"<<endl;
 
    // 从map中获取每一个键
    foreach(QCharRef str,map.keys())
        qDebug() << str << " : " << map.value(str);
 
 
     qSort(list.begin(), list.end(), lessThan);
}
csdnbuku 2015-08-21
  • 打赏
  • 举报
回复
引用 5 楼 yaozhiyong110 的回复:
void bubble_sort(int[] unsorted,int count) { for (int i = 0; i < count; i++) { for (int j = i; j < count; j++) { if (unsorted[i] > unsorted[j]) { int temp = unsorted[i]; unsorted[i] = unsorted[j]; unsorted[j] = temp; } } } } 冒泡排序 网上搜的代码 你参考下...
大神你好,你的意思是加 将map.value(str)加入数组中吗,这样str也会跟着排序?
yaozhiyong110 2015-08-21
  • 打赏
  • 举报
回复
void bubble_sort(int[] unsorted,int count) { for (int i = 0; i < count; i++) { for (int j = i; j < count; j++) { if (unsorted[i] > unsorted[j]) { int temp = unsorted[i]; unsorted[i] = unsorted[j]; unsorted[j] = temp; } } } } 冒泡排序 网上搜的代码 你参考下...
yaozhiyong110 2015-08-21
  • 打赏
  • 举报
回复
引用 3 楼 csdnbuku 的回复:
[quote=引用 1 楼 yaozhiyong110 的回复:] 你用map存就是了 key用QChar value存次数 遍历结果就行了 map默认就按key的顺序存的
[code=c] void test::zpSlot(){ 不好意思 我理解错了 我以为你是要按 '一‘ '不' 等等按字典顺序排序 现在看清楚了你是按出现次数的多少排序 那你可以对map的values在进行一次排序就行了
csdnbuku 2015-08-20
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
你用map存就是了 key用QChar value存次数 遍历结果就行了 map默认就按key的顺序存的

void test::zpSlot(){



    QString str=ui->textEdit->toPlainText();

    QMap<QCharRef,int> map;


    //统计字频
    for(int i=0;i<str.length();i++){
         int s=str.count(str[i]);
         map.insert(str[i],s);
         qDebug()<<str[i]<<s;

    }


        qDebug()<<"-------"<<endl;

    // 从map中获取每一个键
    foreach(QCharRef str,map.keys())
        qDebug() << str << " : " << map.value(str);





}



大神在吗?我改了下, 结果: '一' : 1 '不' : 5 '人' : 1 '好' : 1 '总' : 3 '是' : 1 '的' : 2 不按键值排序。 不知道怎么回事。能帮忙看看问题出在哪里吗。 多谢!
csdnbuku 2015-08-20
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
你用map存就是了 key用QChar value存次数 遍历结果就行了 map默认就按key的顺序存的
多谢!我试试看。
yaozhiyong110 2015-08-20
  • 打赏
  • 举报
回复
你用map存就是了 key用QChar value存次数 遍历结果就行了 map默认就按key的顺序存的

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧