Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Harlon от Март 06, 2018, 16:45



Название: Сортировка списка
Отправлено: Harlon от Март 06, 2018, 16:45
Есть список строк:

A1  12  23  180*  Rsodk  YES
A2  34  53  90*  Rssdodk  NO
A13  12  23  180*  Rsodk  YES
A1_53  23  54  90*  sdsdf  NO
C1  43  35  40*  hererg NO
C20 53  48  80*  ljkretji  YES
C101 23  55  320*  wqe  NO
C1_64  74  90  90*  kqje YES
DR1  42  23  180*  fd  NO
и т.д.

Необходимо получить:

A1  12  23  180*  Rsodk  YES
A1_53  23  54  90*  sdsdf  NO
A2  34  53  90*  Rssdodk  NO
A13  12  23  180*  Rsodk  YES
C1  43  35  40*  hererg NO
C1_64  74  90  90*  kqje YES
C20 53  48  80*  ljkretji  YES
C101 23  55  320*  wqe  NO
DR1  42  23  180*  fd  NO
и т.д.

Букв перед цифрами может быть 3 и больше.

Я думал привести строку к целочисленному значению и отсортировать, но тогда порядок букв теряется.

Помогите пожалуйста, может проще закинуть всё в таблицу или ещё как.


Название: Re: Сортировка списка
Отправлено: deMax от Март 06, 2018, 17:34
псевдокод в слеую левой пяткой:
Код:
QStringList someList;

auto parse = [](const QString &s){
 QString letters, num;
 int pos = 0;
  while(pos<s.size() && (s[pos].isLatter() || s[pos] = ' ' || s[pos]= '_')) { if(s[pos].isLatter())letters += s[pos]; }
  while(pos<s.size() && (s[pos].isDigit() || s[pos] = ' ' || s[pos]= '_')) { if(s[pos].isDigit()) num += s[pos]; }
  return QPair<QString, int>(letters, num.toInt());
};

std::sort_if(someList.begin(), someList.end(),
[](const QString&left, const QString &rigth) {
  auto p1 = parse(left);
  auto p2 = parse(right);
  if(p1.first < p2.first) return true;
  if(p1.first > p2.first) return false;
  if(p1.second < p2.second) return true;
  return false;}

p.s. ну и неплохо написать логику сортировки, мы тут не телепаты догадываться. Малоли что у вас за хитрости и зачем вам так сортировать.


Название: Re: Сортировка списка
Отправлено: kambala от Март 07, 2018, 17:43
а чем не устраивает стандартная сортировка QStringList? она вроде именно нужное и сделает.


Название: Re: Сортировка списка
Отправлено: Igors от Март 08, 2018, 09:01
Код:
  if(p1.first < p2.first) return true;
  if(p1.first > p2.first) return false;
  if(p1.second < p2.second) return true;
  return false;}
Для пары определен оператор < который делает то же. Есть и < =, малюсенький, но очень полезный класс

p.s. ну и неплохо написать логику сортировки,
Именно. Как только правила будут четко сформулированы - никакой помощи больше не потребуется