如何使用多个排序键对列表进行排序

时间:2011-12-12 04:27:31

标签: c++ qt sorting stl hash

我使用比较功能来排序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排序(这不起作用!)

我们如何使用多个排序键进行排序? 是否有可用的数据结构支持此功能? (就像地图总是根据给定的密钥保存事物)

2 个答案:

答案 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);