【问题标题】:How to compare 2 QStringList's and show the results?如何比较 2 个 QStringList 并显示结果?
【发布时间】:2014-10-11 18:44:53
【问题描述】:

我想知道如何比较 2 个QStringList 并按以下方式显示结果:

我有 2 个QPlainTextEdit A 和 B

  • 例如,在 A 中,我有 10 行,每行 6 个数字;
  • 例如,在 B 中,我有 100 行,每行 6 个数字;

我想要做的是:取 B 中的每一行并与 A 中的所有行进行比较。如果在一次行行比较中,所有 6 都等于 int n6(例如)将加 1。如果只有 5 相等,int n5 会加 1,依此类推。

我尝试了一些方法,但都没有奏效。如果您能对此有所了解,我将不胜感激。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    使用QSet 和subtract() 和count() 或size()

    QStringList mOldList, mNewList;
    
      mOldList.append("1");
      mOldList.append("2");
      mOldList.append("3");
      mOldList.append("4");
      mOldList.append("5");
      mOldList.append("10");
    
      mNewList.append("1");
      mNewList.append("2");
      mNewList.append("3");
      mNewList.append("4");
      mNewList.append("5");
      mNewList.append("15");
    
    QSet<QString> subtraction = mNewList.toSet().subtract(mOldList.toSet());
    QSet<QString> subtraction1 = mOldList.toSet().subtract(mNewList.toSet());
    foreach (const QString &filename, subtraction)
            qDebug() << " difference: "<<  filename;
    foreach (const QString &filename, subtraction1)
            qDebug() << " difference: "<<  filename;
    

    结果:

     difference:  "15" 
     difference:  "10" 
    

    例如下一个列表:

      mOldList.append("1");
      mOldList.append("2");
      mOldList.append("3");
      mOldList.append("4");
      mOldList.append("5");
      mOldList.append("10");
    
      mNewList.append("1");
      mNewList.append("2");
      mNewList.append("3");
      mNewList.append("4");
      mNewList.append("5");
      mNewList.append("15");
    
    QSet<QString> subtraction = mNewList.toSet().subtract(mOldList.toSet());
    foreach (const QString &fileName, subtraction)
            qDebug() << " difference: "<<  fileName;
    

    结果只有 15:

     difference:  "15" 
    

    表示一个元素不相同。

      mOldList.append("1");
      mOldList.append("2");
      mOldList.append("3");
      mOldList.append("4");
      mOldList.append("5");
      mOldList.append("10");
    
      mNewList.append("1");
      mNewList.append("2");
      mNewList.append("3");
      mNewList.append("4");
      mNewList.append("115");
      mNewList.append("15");
    

    两个元素不相同:

     difference:  "115" 
     difference:  "15"
    

    或者其他方式:

    qSort(mNewList);
    qSort(mOldList);
    
    if(mNewList == mOldList){
        qDebug() << "same";
    }
    else{
        qDebug() << "not same";
    }
    

    【讨论】:

    • 感谢您的回答,但我如何计算这种差异?
    • @Rafaelpsmed 你的区别在于 QSet,所以只需调用 count() 方法进行减法。它返回 QSet 中元素的数量,但它是您正在寻找的数字。
    • 感谢它的工作。但是我如何将 QPlainText B 中的第一行与 QPlainText A 中的所有行进行比较?然后将 B 中的第二行与 A 中的所有行进行比较,依此类推?
    【解决方案2】:

    首先计算每个字符串的匹配位数

    int matchingDigits(QString str1, QString str2)
    {
        int matches = 0;
        int minSize = str1.size() < str2.size() ? str1.size() : srt2.size();
        for (int pos = 0; pos < minSize; ++pos)
        {
            if (str1.at(pos) == str2.at(pos) ++matches;
        }
        return matches;
    }
    

    现在您将所有字符串相互比较(遍历两个 StringList),如果 matchingDigits() 是 &gt; 0,那么您可以增加结果计数器。

    QStringList listA;
    QStringList listB;
    
    foreach (QString a, listA)
    {
        foreach (QString b, listB)
        {
            int matches = matchingDigits(a, b);
            if (matches > 0)
            {
                // do something fancy
            } 
        }
    }
    

    【讨论】:

    • 感谢您的回答,但我忘了说这将是一个彩票检查应用程序。您的方法有效,但是当 1;2;3;4;5;6 反对 1;2;3;4;5;6 时它返回 11(因为 ; 我猜)并在 1;2;3; 时返回 3; 4;5;6 对 23;53;46;60;13;24。如何解决这个问题?
    • 没关系,我明白了。那么如何将所有字符串相互比较呢?
    • @Rafaelpsmed,我编辑了我的答案以添加比较的基本结构。但是如果你的数字 > 9,字符串比较不是最好的主意。您应该首先为每一行创建一个QStringList,使用qt-project.org/doc/qt-5/qstring.html#split
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多