gpt4 book ai didi

c++ - 自定义字符串排序

转载 作者:太空狗 更新时间:2023-10-29 21:41:26 25 4
gpt4 key购买 nike

我正在使用 QString::localeAwareCompare 对以下字符串集合进行排序:

使用的搜索词:“山”

结果:

  • 地精登山者
  • 迷盲山
  • 磁力山
  • 山羊
  • 山寨
  • 山地巨人
  • 山谷
  • 山雪人
  • 白雪皑皑的山
  • 山中女神

顺序根据QString::compare 词法排序.最终我希望订单具有以下规则:

  1. 在顶部完全匹配
  2. 与按词法排序的前面的值完全匹配。
  3. 单词中包含的词法排序

    • 山 (1)
    • 山羊 (2)
    • 山寨 (2)
    • 山地泰坦 (2)
    • 山谷 (2)
    • 山雪人 (2)
    • 地精登山者 (3)
    • 盲山 (3)
    • 磁山 (3)
    • 雪山 (3)
    • 山中女神 (3)

有人知道如何实现吗?我能够实现某种自定义类型。

编辑:

这是我尝试获取与顶部完全匹配的一些简陋代码,它有效。

bool CardDatabaseDisplayModel::lessThan(const QModelIndex &left, const QModelIndex &right) const {

QString leftString = sourceModel()->data(left).toString();
QString rightString = sourceModel()->data(right).toString();

if (leftString.compare(cardName, Qt::CaseInsensitive) == 0) {// exact match should be at top
return true;
}

if (rightString.compare(cardName, Qt::CaseInsensitive) == 0) {// exact match should be at top
return false;
}

return QString::localeAwareCompare(leftString, rightString) < 0;

}

最佳答案

这是您可以完成当前代码的一种方法。它尝试从最特殊的情况到最一般的情况进行排序:完全匹配、匹配加东西,以及其他一切。

bool CardDatabaseDisplayModel::lessThan(const QModelIndex &left, 
const QModelIndex &right) const {

QString leftString = sourceModel()->data(left).toString();
QString rightString = sourceModel()->data(right).toString();

// The exact match (if any) should be at the top
if (leftString.compare(cardName, Qt::CaseInsensitive) == 0)
return true;
if (rightString.compare(cardName, Qt::CaseInsensitive) == 0)
return false;

// We know that neither is the perfect match.
// But is either a match-plus-some-stuff ?
bool isLeftType2 = leftString.startsWith(cardName, Qt::CaseInsensitive);
bool isRightType2 = rightString.startsWith(cardName, Qt::CaseInsensitive);
if (isLeftType2 && !isRightType2)
return true;
if (isRigthType2 && !isLeftType2)
return false;

// At this point we're sorting two matches of the same type
// Either both are matches-plus-some-stuff or partial matches
return QString::localeAwareCompare(leftString, rightString) < 0;
}

我假设像“Mountaineer”这样的东西单独是类型 2 而不是类型 3,如果你不想这样,你可以在比较中添加一个 +""

关于c++ - 自定义字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28830817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com