QT 项目 表格新建列名称设置 需求练习(找数组消失的数字、最大值)

QT项目练习需求:

节目列向前向后插入或者新建列的名称设置:如之前被删除先找中间缺少的列 添加,否则找最大值,名称也可随时修改、可重复,项目分析各种情况如下:

例如下:找最大值, 此时新建列 名称为 节目5

 例如下:找中间缺的最小值, 此时新建列 名称则为 节目2

 

例如下: 此时新建列 名称为 节目1 (节目1ss 不符合 节目”+数字)

 主要代码:

QVector<ProgramCol*> programColList;//存储列数组
class ProgramCol{
   int programId = 0;//节目id
   int m_col = 0;// 列
   string m_name ="节目";//节目名称
}


//插入、新建列 col传新的位置
int ProgramManagement::insertProgramCol(int col)
{
     int len = programColList.size();
     int index = 0;
     for (int n = 0; n < len; n++) {
        if(programColList[n]->m_col == col ){
            programColList[n]->m_col+=1;
            index = n;
        }else if(programColList[n]->m_col > col){
            programColList[n]->m_col+=1;
        }
     }

     int id = getMaxProgramColId();
     id ++;
     int nameIndex = findColNameIndex();

     ProgramBaseAttr* info = new ProgramBaseAttr();
     info->programId = id;
     info->m_col = col;
     info->m_name = "节目" + to_string(nameIndex);
     programColList.insert(index,info);


     qDebug()<< "programColList col== " << col<<nameIndex;
    return nameIndex;
}

bool ProgramManagement::isNum(string str)
{
    stringstream sin(str);
    double d;
    char c;
    if(!(sin >> d))
    {
        /*解释:
            sin>>t表示把sin转换成double的变量(其实对于int和float型的都会接收),
            如果转换成功,则值为非0,如果转换不成功就返回为0
        */
        return false;
    }
    if (sin >> c)
    {
        /*解释:
        此部分用于检测错误输入中,数字加字符串的输入形式(例如:34.f),在上面的的部分(sin>>t)
        已经接收并转换了输入的数字部分,在stringstream中相应也会把那一部分给清除,
        此时接收的是.f这部分,所以条件成立,返回false
          */
        return false;
    }
    return true;
}

//找到数组中消失的数字
vector<int> ProgramManagement::findDisappearedNumbers(vector<int>& num)
{
    vector<int>res;
    if(num.size() == 0) return res;
    sort(num.begin(),num.end());
    num.erase(unique(num.begin(), num.end()), num.end());     //unique返回值是重复元素的开始位置

    vector<int>::iterator it;
    for(int j=1;j<=num[num.size()-1];j++)
    {
        it=find(num.begin(),num.end(),j);
        if(it==num.end())
        {
            res.push_back(j);
        }
    }

    for(int i=0;i<res.size();i++)
    {
        cout<<res[i]<<endl;
    }
    return res;
}

// 节目列向前向后插入、新建列:如之前被删除先找中间缺少的列 添加,否则找最大值(不能把 找到缺失的值赋给id,如果之前改过名会重复, 节目id还是找id最大+1)
int ProgramManagement::findColNameIndex()
{
    vector<int> nums = {};
    for(int i = 0;i<programColList.size();i++) {
        string name1 = programColList[i]->m_name.substr(0, 6);//截取开头 "节目"
        qDebug() << "name1==== " << QString::fromStdString(name1);
        if(name1 == "节目") {
            string name2 = programColList[i]->m_name.substr(6);//截取"节目"之后
            qDebug() << "name2==== " << QString::fromStdString(name2);

            if(isNum(name2) && (name2.substr(0, 1) != "0"))//判断为数字并且 不以0开头
            {
                int numA = atoi(name2.c_str());//string 转成int

                qDebug() << "字符串转换成int 大于0 并且 开头不为0 加入数组 === =" << numA;
                if(numA > 0) {
                   nums.push_back(numA);
                }
            }
        }
    }

    qDebug() << "nums size == " << nums.size();

    int nameIndex = 1;
    if(nums.size() > 0) { //没改过名 符合“节目”+数字 数组大于0 查找缺失。 =0 都被改过不符合名称 nameIndex就直接等于1
        vector<int> l = findDisappearedNumbers(nums);
        qDebug() << "l size == " << l.size();
        if(l.size() > 0) {
            //找到缺失数字 nameIndex等于第一项
            nameIndex = l[0];
        } else {
            //没有找到缺失 就找 名称数组 最大值+1 ,(节目列名称、顺序都可以改,找col 不准)
            vector<int>::iterator itMax = max_element(nums.begin(), nums.end());
            nameIndex = *itMax + 1;
        }
    }

    qDebug() << "nameIndex== " << nameIndex;
    return nameIndex;
}


int ProgramManagement::getMaxProgramColId() {
    int maxid = 0;
    foreach(auto scr, programColList)
    {
        if(scr->programId > maxid)
        {
            maxid = scr->programId;
        }
    }
    return maxid;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值