powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка массива записей по произвольному полю записи
18 сообщений из 43, страница 2 из 2
Сортировка массива записей по произвольному полю записи
    #40074387
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox

Код: pascal
1.
2.
    //Result := AnsiCompareStr(par_a, par_b);
    Result := CompareValue(par_a, par_b);


Работает

Но при этом string не сравнивает, беда......
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074390
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зафигакай сравнение Variant-ов.
универсально, но медленно.

либо те большие, но по 5 рублей (вчера), либо эти маленькие по 3, но сегодня. (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074397
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Но при этом string не сравнивает, беда...
По идее вот так может заработать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TArray.Sort<TMyRec>(a, TComparer<TMyRec>.Construct(
  function (const AItem1, AItem2: TMyRec): Integer
  var
    par_a, par_b: TValue;
  begin
    par_a := fields[findx].GetValue(@AItem1);
    par_b := fields[findx].GetValue(@AItem2);
    Result := TComparer<TValue>.Default.Compare(par_a, par_b);
  end
));
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074399
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

зафигакай сравнение Variant-ов.
универсально, но медленно.

либо те большие, но по 5 рублей (вчера), либо эти маленькие по 3, но сегодня. (С)


уже сделал, но не красиво...
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074401
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
31.05.2021 14:52, antox пишет:
> уже сделал, но не красиво...

одно яичко выше? (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074404
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
DimaBr
Но при этом string не сравнивает, беда...
По идее вот так может заработать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TArray.Sort<TMyRec>(a, TComparer<TMyRec>.Construct(
  function (const AItem1, AItem2: TMyRec): Integer
  var
    par_a, par_b: TValue;
  begin
    par_a := fields[findx].GetValue(@AItem1);
    par_b := fields[findx].GetValue(@AItem2);
    Result := TComparer<TValue>.Default.Compare(par_a, par_b);
  end
));



Немного подправил (Variant вместо TValue) и заработало:

Код: pascal
1.
2.
3.
4.
    par_a := fields[findx].GetValue(@AItem1).AsVariant;
    par_b := fields[findx].GetValue(@AItem2).AsVariant;

    Result := TComparer<Variant>.Default.Compare(par_a, par_b);
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074406
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также работает и эта конструкция:

Код: pascal
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.
procedure Sort(field_name: string);
var
  i,j,n,f,findx: integer;
  val_i, val_j,  tmp: TMyRec;
  rtype: TRTTIType;
  fields: TArray<TRttiField>;
begin
  n:= High(A);

  rtype := TRTTIContext.Create.GetType(TypeInfo(TMyRec));
  fields := rtype.GetFields;

  findx:=-1;

  for f := Low(fields) to High(fields) do
    if fields[f].Name = field_name then findx := f;

  if findx < 0 then Exit;


  for i:=1 to n-1 do
  for j:=i+1 to n do
    begin
      val_i := a[i];
      val_j := a[j];

      if fields[findx].GetValue(@val_i).AsVariant> fields[findx].GetValue(@val_j).AsVariantthen
        begin
          tmp:=a[i];
          a[i]:=a[j];
          a[j]:=tmp;
        end;
    end;
end;
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074407
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

31.05.2021 14:52, antox пишет:
> уже сделал, но не красиво...

одно яичко выше? (С)


третье появилось :D
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074410
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более чем уверен, что через год, смотря на это синтаксический мусор, вы будите думать, а что же тут происходит?
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074411
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникает вопрос, что быстрее будут работать

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
for i:=1 to n-1 do
  for j:=i+1 to n do
    begin
      val_i := a[i];
      val_j := a[j];

      if fields[findx].GetValue(@val_i).AsVariant> fields[findx].GetValue(@val_j).AsVariantthen
        begin
          tmp:=a[i];
          a[i]:=a[j];
          a[j]:=tmp;
        end;
    end;



или

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TArray.Sort<TMyRec>(a, TComparer<TMyRec>.Construct(
  function (const AItem1, AItem2: TMyRec): Integer
  var
    par_a, par_b: TValue;
  begin
    par_a := fields[findx].GetValue(@AItem1);
    par_b := fields[findx].GetValue(@AItem2);
    Result := TComparer<Variant>.Default.Compare(par_a, par_b);
  end
));
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074414
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Premature optimization.

Тромозить будет не это.
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074418
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Возникает вопрос, что быстрее будут работать
Очевидно же, что второй вариант. Быстрая сортировка всегда быстрее пузырьковой
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074423
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Тьфу, блин.
Я на разницу в приведении типов смотрел а на то что они там в первом случае еще метод и пузырька зачем-то приделал.
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074453
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
antox
Возникает вопрос, что быстрее будут работать
Очевидно же, что второй вариант. Быстрая сортировка всегда быстрее пузырьковой

Вообще - не всегда, но первый вариант - ниразу не пузырьковая сортировка.
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074473
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
первый вариант - ниразу не пузырьковая сортировка.
А что это тогда?
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074476
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Maxim Rusov
первый вариант - ниразу не пузырьковая сортировка.
А что это тогда?

Пузырькова сортировка в цикле переставляет элементы до тех пор, пока не случится пустой проход.
А тут - какой-то декартов п....ц.
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40074479
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сортировка массива записей по произвольному полю записи
    #40076062
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
antox
Так тут все равно напрямую указано имя поля field1 , а мне что бы по любому имени, или имеется в виду, что для каждого поля будет такая функция


чтобы не указывать имя поля при сортировке по любому из них:

Код: pascal
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.
unit TestTypes;
interface
uses System.SysUtils, Generics.Defaults, Generics.Collections;
type
  TMyRec = record
    type TIndex = 1..3;
    var
    field1,
    field2,
    field3: string;
    function Field (idx: TIndex): string;
  end;
  TMyArray = TArray <TMyRec>;
implementation
function TMyRec.Field(idx: TIndex): string;
begin
  case idx of              // не особо элегантно, но работает
    1: Result := field1;
    2: Result := field2;
    3: Result := field3;
  end;
end;
procedure DoSomething (idx: TMyRec.TIndex);
var
  a: TMyArray;
begin
  SetLength (a, 1000);
  TArray.Sort <TMyRec> (a, TComparer <TMyRec>.Construct (
    function (const L,R: TMyRec): Integer
    begin
      Result := AnsiCompareStr (L.Field(idx), R.Field(idx));
    end
    ));
end;
end.

...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сортировка массива записей по произвольному полю записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]