自定义字符串排序

Posted

技术标签:

【中文标题】自定义字符串排序【英文标题】:Custom string sorting 【发布时间】:2015-03-03 11:35:55 【问题描述】:

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

使用的搜索词:“山”

结果:

地精登山者 疯子山 磁山 山 山羊 山地要塞 泰坦山 山谷 雪人山 雪山 山中女神

顺序按照QString::compare进行词法排序。 最终,我希望订单具有以下规则:

    顶部完全匹配 与按词法排序的前面值完全匹配。

    按词法排序的单词中包含的匹配项

    山 (1) 山羊 (2) 山地要塞 (2) 泰坦山 (2) 山谷 (2) 雪人山 (2) 地精登山者 (3) 疯人山 (3) 磁山(3) 雪山 (3) 山女 (3)

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

编辑:

这里有一些我试图让完全匹配到顶部的 janky 代码,它有效。

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;


【问题讨论】:

显示您尝试过的内容 @ArunA.S 添加了一些我尝试过的实验。 【参考方案1】:

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

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,如果你不希望这样,你可以在比较中添加 +" "

【讨论】:

以上是关于自定义字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

按自定义字典顺序对字符串进行排序

根据对另一个 NSArray 字符串的排序,对自定义对象的 NSArray 进行排序

LeetCode 0791. 自定义字符串排序

【JS】数组对象自定义排序

字典自定义排序

GridControl列自定义排序