我使用比较功能来排序QList 和MyClass有n个不同的属性,如地址,年龄,名字,姓氏等
SortKey是这样的。
typedef QPair<QString, Qt::SortOrder> SortKeyPair;
//pair of attr name (i.e. gender and order of sorting asc|desc)
static bool compare( MyClass *o1, MyClass *o2)
{
//sortKey is global static var.
if (sortKey.second == Qt::AscendingOrder) {
if (o1->dataField(sortKey.first) < o2->dataField(sortKey.first)) return true;
else return false;
} else {
if (o1->dataField(sortKey.first) > o2->dataField(sortKey.first)) return true;
else return false;
}
return false;
}
按单个attr排序。适用于qSort。 但是我需要用多个attr排序的列表。喜欢&#39;按姓氏排序,然后按年龄排序,然后按性别排序&#39;
我需要一个sort函数来按多个sortKey排序(这不起作用!)
我们如何使用多个排序键进行排序? 是否有可用的数据结构支持此功能? (就像地图总是根据给定的密钥保存事物)
答案 0 :(得分:3)
只需以逻辑方式定义谓词,使用主键进行比较,并在主要不确定时使用次要键作为后备:
if (o1->dataField( firstSortKey ) < o2->dataField( firstSortKey ))
return true;
else if (o1->dataField( firstSortKey) > o2->dataField( firstSortKey ))
return false;
else if ( o1->dataField( secondSortKey ) < o2->dataField( secondSortKey ) )
return true;
else
return false;
或者,对于一般情况:
bool compare_on( int key_index, ...) {
if (o1->dataField( key[key_index] ) < o2->dataField( key[key_index] ))
return true;
else if (o1->dataField( key[key_index] ) > o2->dataField( key[key_index] ))
return false;
else if ( key_index == max_key_index )
return false;
else
return compare_on( key_index + 1 );
答案 1 :(得分:1)
您可以使用std :: tuple(或旧版C ++ 03的boost :: tuple)在一行中进行此比较:
return make_tuple(a.lastname, a.age, a.gender) < make_tuple(b.lastname, b.age, b.gender);