自定义字符串排序
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,如果你不希望这样,你可以在比较中添加 +" "
。
【讨论】:
以上是关于自定义字符串排序的主要内容,如果未能解决你的问题,请参考以下文章