Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QStringList>
- #include <QPair>
- #include <QVariant>
- namespace MySort {
- typedef QPair<QList<QVariant>,int> Item; //(int|string)* sequence, value index
- typedef bool (*lessThan)(const Item&, const Item&);
- template <class T> class Helper {
- public:
- Helper(QStringList& keys, QList<T>& values) : m_values(values) { initKeys(keys); }
- Helper(QList<Item>& keys, QList<T>& values) : m_keys(keys), m_values(values) {}
- void initKeys(const QStringList& keys) {
- int n = keys.size();
- // foreach keys
- for(int i=0;i<n;i++) {
- QString key = keys.at(i);
- QList<QVariant> item;
- QString intPart;
- QString charPart;
- int l = key.size();
- // char-by-char parse
- for (int j=0;j<l;j++) {
- QChar c = key.at(j);
- if (c.isDigit()) {
- intPart.append(c);
- if (!charPart.isEmpty()) {
- item.append(charPart);
- charPart = QString();
- }
- } else {
- charPart.append(c);
- if (!intPart.isEmpty()) {
- item.append(intPart.toInt());
- intPart = QString();
- }
- }
- }
- // flush
- if (!charPart.isEmpty())
- item.append(charPart);
- if (!intPart.isEmpty())
- item.append(intPart.toInt());
- m_keys.append(Item(item,i));
- }
- }
- void sort(lessThan theLessThan) {
- qSort(m_keys.begin(),m_keys.end(),theLessThan);
- QList<T> m_sortedValues;
- Item item;
- foreach(item,m_keys) {
- int index = item.second;
- m_sortedValues.append(m_values.at(index));
- }
- m_values = m_sortedValues; // hmmm...
- }
- private:
- QList<Item> m_keys;
- QList<T>& m_values;
- };
- bool firstPartLessThan(const Item& item1, const Item& item2) {
- if (item1.first.size()<1)
- return true;
- if (item2.first.size()<1)
- return false;
- const QVariant& v1 = item1.first.at(0);
- const QVariant& v2 = item2.first.at(0);
- if (v1.type() == QVariant::Int && v2.type() == QVariant::Int) {
- return v1.toInt() < v2.toInt();
- } else if (v1.type() == QVariant::String && v2.type() == QVariant::String) {
- return v1.toString() < v2.toString();
- } else if (v1.type() == QVariant::Int) {
- return true;
- } else if (v2.type() == QVariant::Int) {
- return false;
- }
- return false;
- }
- }
- #include <QDebug>
- #include <time.h>
- int main(int,char**) {
- qsrand(time(0));
- QStringList values;
- QStringList keys;
- QString chars = "01234567890abcdefgh";
- int chars_size = chars.size();
- //generate 20 random strings
- for (int i=0;i<20;i++) {
- QString key;
- // length 5..10
- int l = qrand() % 5 + 5;
- for (int j=0;j<l;j++)
- key.append(chars.at(qrand() % chars_size));
- keys << key;
- values << key;
- }
- MySort::Helper<QString> helper(keys,values);
- helper.sort(&MySort::firstPartLessThan);
- QString value;
- foreach (value,values) {
- qDebug() << value;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement