Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 41

Сортировка строк в memo по датам

25.02.2014, 20:24. Показов 2301. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
возникла проблемка, необходимо отсортировать строки в memo такого типа 23.12.2014;ручка;паркер, 12.6.1995;карандаш;паркер....только по числам(c++ builder) по возростанию исключая совпадения
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2014, 20:24
Ответы с готовыми решениями:

Сортировка строк в Memo
uses FileCtrl; var Form1: TForm1; gPath : String = ''; //Путь к папке. procedure TForm1.Button1Click(Sender: TObject); var ...

Сортировка строк из текстового док. в Memo
Нашел на форуме уже готовую сортировку от товарища volvo, function myCompare (List : TStringList; Index1, Index2 : Integer) :...

Сортировка в memo по маске\Сортировка нескольких связанных memo
Доброго времени! Есть несколько memo, в которых генерируются данные по алгоритму: ...

10
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
26.02.2014, 09:55
Сортировка строк в Мемо
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
26.02.2014, 13:39
Меня терзают сомнения, что надо упорядочить не по числам, а по датам, которые этими числами образованы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int __fastcall DoCompareDates(TStringList *List, int Index1, int Index2)
{
    int Day, Month, Year;
    TDate first, second;
    swscanf(List->Strings[Index1].c_str(), L"%d.%d.%d", &Day, &Month, &Year);
    first = EncodeDate(Year, Month, Day);
    swscanf(List->Strings[Index2].c_str(), L"%d.%d.%d", &Day, &Month, &Year);
    second = EncodeDate(Year, Month, Day);
    return CompareDate(first, second); // #include <DateUtils.hpp>
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TStringList>list(new TStringList); // #include <memory>
    list->AddStrings(Memo1->Lines);
    list->CustomSort(DoCompareDates);
    Memo1->Lines->Assign(list.get());
}
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
26.02.2014, 14:42
А мне вот чуть менее элегантное, но более универсальное решение придумалось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#define STARTNUMCOL 1 // С какого номера отсчитывать столбцы
                      // То есть самый левый столбец имет номер STARTNUMCOL
 
char delim = ';';   // К примеру
int numCol = 1;     //   глобальные
 
//---------------------------------------------------------------------------
String GetSubstrInCol( String inStr, const char *delim, int numCol ) // Рекурсивная функция поиска подстроки
{                                                                    // Шинкует строку по разделителю numCol раз
if( numCol <= STARTNUMCOL )     // Если тот самый столбец
  {                             //
  return inStr.SubString(       ///////////// Вернуть кусок стрки до разделителя
                         0,
                         inStr.Pos( delim ) - 1
                         );
  }
else                            // Если нет
  {                             //////////////
  return GetSubstrInCol( inStr.SubString(   // Передать в себя же без куска строки до разделителя
                                         inStr.Pos( delim ) + 1,
                                         inStr.Length()
                                         ), //
                         delim,             // Передать разделитель дальше
                         --numCol );        // Уменьшить номер текущего столбца
  }
}
//---------------------------------------------------------------------------
int __fastcall HowToSort( TStringList *sl, int numStr1, int numStr2 ) // Функция, задающая правило как сортировать
/* 1. Если строка с индексом numStr1 должна расположиться выше строки с индексом
   numStr2, то функция должна вернуть значение меньшее нуля.
   2. Если строка с индексом numStr1 должна расположиться ниже строки с индексом
   numStr2, то функция должна вернуть значение большее нуля.
   3. Если принято решение, что строки с индексами numStr1 и numStr2 равны, то функция
   должна вернуть значение равное нулю. */
{
if( GetSubstrInCol( sl->Strings[numStr1], &delim, numCol ) <
    GetSubstrInCol( sl->Strings[numStr2], &delim, numCol )   )
    return -1;
else if (GetSubstrInCol( sl->Strings[numStr1], &delim, numCol ) >
         GetSubstrInCol( sl->Strings[numStr2], &delim, numCol )   )
         return 1;
else return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
              // Изменяем как нам надо
delim = ';';  //  символ разделитель
numCol = 1;   //  и по которому столбцу сортируем
 
TStringList *sl = new TStringList;
sl->Text = Memo1->Text;
sl->Text = StringReplace( sl->Text,                    // Добавляем разделитель в конец каждой строки
                          "\r\n",                      //  для унификации функции поиска подстроки
                          String( delim ) + "\r\n",
                          TReplaceFlags() << rfReplaceAll );
 
sl->Sorted = true;                  // Включаем сотрировку, чтобы работала следующая строка
sl->Duplicates = Types::dupIgnore;  // Отключаем добавление дубликатов при сортировке
                                      //// Но поскольку сортировка рукопашная, то работает нестабильно (! обратите внимание)
                                      //// Надо писать самим
sl->Sort();                           //// Но если сосем лень, то можно продублировать проход по списку штатными средствами
sl->Text = sl->Text;                  //// И вот такой некрасивый ход использовать
 
sl->Sorted = false;                   //// Ну и конечно отключить потом автоматическую сортировку
 
sl->CustomSort( HowToSort );        // Собственно сортируем
 
 
sl->Text = StringReplace( sl->Text,                    // Убираем обратно
                          String( delim ) + "\r\n",
                          "\r\n",
                          TReplaceFlags() << rfReplaceAll );
 
Memo1->Text = sl->Text; // Вывод
delete sl;
}


Без нихто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define STARTNUMCOL 1 
char delim = ';';
int numCol = 1;
//---------------------------------------------------------------------------
String GetSubstrInCol( String inStr, const char *delim, int numCol )
{
if( numCol <= STARTNUMCOL )    
  return inStr.SubString( 0, inStr.Pos( delim ) - 1 );
else
  return GetSubstrInCol( inStr.SubString( inStr.Pos( delim ) + 1, inStr.Length() ),
                delim,
                --numCol );
}
//---------------------------------------------------------------------------
int __fastcall HowToSort( TStringList *sl, int numStr1, int numStr2 ) 
{
if( GetSubstrInCol( sl->Strings[numStr1], &delim, numCol ) <
    GetSubstrInCol( sl->Strings[numStr2], &delim, numCol )   )
    return -1;
else if (GetSubstrInCol( sl->Strings[numStr1], &delim, numCol ) >
         GetSubstrInCol( sl->Strings[numStr2], &delim, numCol )   )
         return 1;
else return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
delim = ';';
numCol = 1;
 
TStringList *sl = new TStringList;
sl->Text = Memo1->Text;
sl->Text = StringReplace( sl->Text, "\r\n", String( delim ) + "\r\n", TReplaceFlags() << rfReplaceAll );
 
sl->Sorted = true;                  
sl->Duplicates = Types::dupIgnore;
sl->Sort();                           
sl->Text = sl->Text;              
sl->Sorted = false;               
 
sl->CustomSort( HowToSort );
 
sl->Text = StringReplace( sl->Text, String( delim ) + "\r\n", "\r\n", TReplaceFlags() << rfReplaceAll );
 
Memo1->Text = sl->Text;
delete sl;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
26.02.2014, 14:45
Это "универсальное" решение записывается безо всякой рекурсии в две строки кода. Ну хорошо, в 4 - максимум. StringReplace идет лесом, Delimiter никто не отменял.

К тому же - ты прямо такой хитрый. А попробуй в первом столбце записать не цифры от 1 до 7, а числа, скажем, <1, 2, 6, 11, 12, 7, 5>, и посмотри, что выдаст твой "универсальный" код. И потом внимательно почитай вторую строку первого поста... Понимаешь, о чем я?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
26.02.2014, 16:02
Цитата Сообщение от UI Посмотреть сообщение
а числа

Задачу ТС выполняет.
Цитата Сообщение от UI Посмотреть сообщение
почитай вторую строку первого поста
Так вот же:
Цитата Сообщение от SatanaXIII Посмотреть сообщение
C++
59
sl->Duplicates = Types::dupIgnore;
У тебя вообще про вторую строку не слова.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 41
28.02.2014, 11:50  [ТС]
а если у меня 3 значное и 2 число будет между точками (первая строка 112.134.5; а вторая 12.34.5), что тогда делать, сортировка уже действует не верно
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
28.02.2014, 11:57
Jan_Smit, посмотрите внимательно
Цитата Сообщение от UI Посмотреть сообщение
C++
1
2
3
4
int Day, Month, Year;
* * TDate first, second;
* * swscanf(List->Strings[Index1].c_str(), L"%d.%d.%d", &Day, &Month, &Year);
* * first = EncodeDate(Year, Month, Day);
числа разделённые точкой преобразуются в календарную дату. Разумеется, если у Вас трёхзначные числа разделены точками, то сортировка по дате Вам не подходит. Нужно писать свой код сортировки по логике Вашей программы.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 41
28.02.2014, 12:20  [ТС]
да, у меня не дата, притом ряд может состоять из 4 чисел, тоесть 12.13.14.15; + мне необходимо сравнить это с опредиленным промежутком, я думал использовать структуру....что можно придумать?
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
28.02.2014, 12:23
Цитата Сообщение от Jan_Smit Посмотреть сообщение
что можно придумать?
Для начала полностью сформулируйте задачу. Три числа... четыре цифры.... может, не может... - Ничего же не понять.
А вообще. Если сортировка не относится к мемо и датам, то новую тему создайте.
0
0 / 0 / 0
Регистрация: 25.02.2014
Сообщений: 41
28.02.2014, 12:38  [ТС]
такая тема уже есть : "Записать строки Memo в структуру и выяснить соответствуют ли они определенному фильтру"

Добавлено через 2 минуты
такая тема уже есть Записать строки Memo в структуру и выяснить соответствуют ли они определенному фильтру
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2014, 12:38
Помогаю со студенческими работами здесь

Сортировка по датам
Всем привет! Нужно сделать сортировку по датам. Как это можно сделать? Вывод на странице: &lt;div...

сортировка по датам
Добрый день! Подскажите пожалуйста как правильно отсортировать список &quot;работников&quot;. Колонок много (не в этом суть) есть 2 поля с...

Сортировка структуры по датам
в радиоателье храняться квитанции о сданных в ремонт телевизорах. каждая квитанция содержит следующую информацию: марка телевизора, дата...

Сортировка данных по датам
Доброго времени суток. Уважаемые помогите. читал Ваши советы народу и написал запрос к базе Access результатом должна быть сортировка...

Сортировка в БД Delphi по датам
Всем привет! Люди добрые очень нужна ваша помощь. Есть база данных в которую я заношу данные через Delphi. (рис.1) При нажатии на кнопку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru