0

我有一个包含文件名的 QStringList。找到它们的共同根,即它们共同的左侧部分的正确方法是什么?

我正在写 c++ 并使用 Qt。

4

3 回答 3

4

这是一个算法:

  • 将第一个字符串作为root
  • 对于列表中的每个项目
    • 如果rootitem长
      • 截断项目.length());
    • 对于根中的每个索引i
      • 如果[ i ] 与项目[ i ] 不匹配

编辑:一些我没有测试但“应该”工作的代码。

c++03代码:

QString find_root(const QStringList& list)
{
    QString root = list.front();
    for(QStringList::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        if (root.length() > it->length())
        {
            root.truncate(it->length());
        }

        for(int i = 0; i < root.length(); ++i)
        {
            if (root.at(i) != it->at(i))
            {
                root.truncate(i);
                break;
            }
        }
    }

    return root;
}

c++11代码:

QString find_root(const QStringList& list)
{
    QString root = list.front();
    for(const auto& item : list)
    {
        if (root.length() > item.length())
        {
            root.truncate(item.length());
        }

        for(int i = 0; i < root.length(); ++i)
        {
            if (root[i] != item[i])
            {
                root.truncate(i);
                break;
            }
        }
    }

    return root;
}
于 2013-07-12T14:11:12.677 回答
0

没有现成的解决方案,但编写新代码只需 5 分钟:

int commonBeginningLength(const QString &a, const QString &b) {
    int maxLen = qMin(a.length(), b.length());
    int i=0;
    for(int i=0; i<maxLen; ++i)
        if (a.at(i)!=b.at(i))
            break;
    return i;
}

QString comonBegining(const QStringList &list) {
    if (list.isEmpty())
       return QString();
    QString result(list.front());
    for(int i=1; i<list.count(); ++i) {
        result = result.left(commonBeginningLength(result, list.at(i)));
    }
    return result;
}
于 2013-07-12T14:38:36.150 回答
0

遍历 QStringList,比较根和每个字符串:

QString root(QString &a, QString &b)
{
    QString str;

    for(int i = 0; i < a.length() && i < b.length(); ++i) {
        if(a.at(i) == b.at(i))str.push_back(a.at(i));
        else break;
    }
    return str;
}

QString dosth(QStringList &list)
{
    QString str;
    if(list.isEmpty()) return str;
    for(int i = 0; i < list.length(); ++i) {
        str = root(str, list.at(i));
    }
    return str;
}
于 2013-07-12T14:19:57.690 回答