Russian Qt Forum
Ноябрь 27, 2024, 05:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка списка  (Прочитано 3189 раз)
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 и больше.

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

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

Сообщений: 600



Просмотр профиля
« Ответ #1 : Март 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. ну и неплохо написать логику сортировки, мы тут не телепаты догадываться. Малоли что у вас за хитрости и зачем вам так сортировать.
« Последнее редактирование: Март 06, 2018, 17:39 от deMax » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Март 07, 2018, 17:43 »

а чем не устраивает стандартная сортировка QStringList? она вроде именно нужное и сделает.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 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. ну и неплохо написать логику сортировки,
Именно. Как только правила будут четко сформулированы - никакой помощи больше не потребуется
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.247 секунд. Запросов: 23.