powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать Асоциативный многомерный массив
25 сообщений из 75, страница 1 из 3
Как сделать Асоциативный многомерный массив
    #39986039
NikolasGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
В PHP и других языках есть асоциативные массивы. С ними очень удобно работать. А вот в Delphi из коробки их нет. В нете есть несколько подобий их реализации, но что-то у меня ни один не заработал (Rad Studio 10.3)

Может вы знаете какую нибудь реализацию асоциативных массивов в Delphi?
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986040
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ассоциативный массив - это ключ + значение?

Разве такого в Delphi нет?
А дженерики? TCollection, TList, TDictionary?
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986109
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolasGood,

JSON, TStringList
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986120
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многомерный это как? В ключе надо чтоб стояло 2 параметра?
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986143
X11,

В PHP массивы это Ключ (Строка \ Число) => Любое значение. С сохранением порядка добавления.

И это очень быстро работает, особенно в связке с миллион функций для сортировки этих массивов.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986146
mayton
Многомерный это как? В ключе надо чтоб стояло 2 параметра?


Без ограничений там.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
$Arr1 = [1, 2, 3];
$Arr2 = [4, $Arr1, 5];
$Arr3 = [];
$Arr3[] = 'Hello';
$Arr3[1] = $Arr2[2];
$Arr3[] = $Arr2;

print_r($Arr3);




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Array
(
    [0] => Hello
    [1] => 5
    [2] => Array
        (
            [0] => 4
            [1] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

            [2] => 5
        )

)
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986162
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надо массив произвольной структуры, то стоит использовать XSuperObject.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986168
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
В PHP массивы это Ключ (Строка \ Число) => Любое значение.


в Дельфи есть Variant
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986170
X11,

Лучше уж TValue чем этот Variant
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986171
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,
TValue - тормоз.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986174
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986195
rgreat,

Не TValue тормоз, а дженерики тормознутые.

Variant
0.000268
6,69692879491417E304
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button1Click(Sender: TObject);
var
  A, b, C: Variant;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b + (A / I) + b;
    C := (b - A) * A;
  end;

  ShowMessage(PrintTime(T1) + #13 + VarToStr(C))
end;



TValue
0.000365
6,69692879491417E304
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button2Click(Sender: TObject);
var
  A, b, C: TValue;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b.AsExtended + (A.AsExtended / I) + b.AsExtended;
    C := (b.AsExtended - A.AsExtended) * A.AsExtended;
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;



Но стоит поменять с AsExtended
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function TValue.AsExtended: Extended;
begin
  if not IsEmpty then
  begin
    if FTypeInfo = System.TypeInfo(Extended) then
      Exit(FAsExtended)
    else if FTypeInfo^.Kind = tkFloat then
      case GetTypeData(FTypeInfo)^.FloatType of
        ftSingle: Exit(FAsSingle);
        ftDouble: Exit(FAsDouble);
        ftExtended: Exit(FAsExtended);
      end;
  end;
  Result := AsType<Extended>;
end;



На прямой вызов AsType<Extended>

0.001695
6,69692879491417E304
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button3Click(Sender: TObject);
var
  A, b, C: TValue;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b.AsType<Extended> + (A.AsType<Extended> / I) + b.AsType<Extended>;
    C := (b.AsType<Extended> - A.AsType<Extended>) * A.AsType<Extended>;
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;



Сразу какие то Цифры огромные в потери вызова


Код: 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.
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.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, rtti;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  T1: Int64;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): integer; cdecl;
  varargs; external 'msvcrt.dll';

procedure StartTime;
begin
  QueryPerformanceCounter(T1);
end;

function PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  A, b, C: Variant;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b + (A / I) + b;
    C := (b - A) * A;
  end;

  ShowMessage(PrintTime(T1) + #13 + VarToStr(C))
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  A, b, C: TValue;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b.AsExtended + (A.AsExtended / I) + b.AsExtended;
    C := (b.AsExtended - A.AsExtended) * A.AsExtended;
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  A, b, C: TValue;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := b.AsType<Extended> + (A.AsType<Extended> / I) + b.AsType<Extended>;
    C := (b.AsType<Extended> - A.AsType<Extended>) * A.AsType<Extended>;
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;

end.

...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986209
Пробить отметку ниже 0.000347 не получается никак
Код: 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.
function GetExtended(var v: TValue): Extended; inline;
begin
  Result := 0;
  v.ExtractRawData(@Result);
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  A, b, C: TValue;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := GetExtended(b) + (GetExtended(A) / I) + GetExtended(b);
    C := (GetExtended(b) - GetExtended(A)) * GetExtended(A);
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;



Слишком низко качественный код оптимизатор генерирует.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986211
experience
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ассоциативней не бывает
http://www.minimdb.com/download/minimonowin64list.html

MiniM Embedded Edition (Win64) Content List

MiniM Embedded Edition Installer setup the following applications, tools, documentation and additional files:

MiniMono Dynamic Link Library for Windows x64
MiniMono Routine Editor
MiniMono Global Editor
MiniM Collation Editor
MiniMono command-line interface
MiniMono console interface
Initial content of system routines
Default empty database file
MiniM Language Guide
MiniM Advanced Guide
Default set of collation files
Interface files for C++, Delphi and C#
Examples for C++, Delphi and C#
JNI module and Java examples
ZDEVICE Examples
ZDLL Examples
Current build release notes
MiniMono Uninstaller
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986216
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Пробить отметку ниже 0.000347 не получается никак
А если
Код: pascal
1.
2.
var
  A, b, C: Extended;

?
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986218
_Vasilisk_,

Так суть в том что, тип может и с первой женой, и со второй, и с парнем за гаражом.

Ну ладно.

0.000039
6,69692879491417E304

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button4Click(Sender: TObject);
var
  A, b, C: Extended;
  I: integer;
begin
  A := 0;
  b := 0;
  C := 0;

  StartTime;
  for I := 1 to 1000 do
  begin
    A := (5 * I) / 2;
    b := (b) + ((A) / I) + (b);
    C := ((b) - (A)) * (A);
  end;

  ShowMessage(PrintTime(T1) + #13 + C.ToString)
end;

...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986220
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, любая древовидная структура данных автору подходит.

Возможно подойдет и JSonDocument, XmlDocument но если нужна будет быстрая навигация
по известному "path" то надо смотреть какая структура внутри. Не везде хеш-табличка
в основе.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986224
mayton,

Из самых банальных
Код: pascal
1.
2.
3.
type
  TBaseData = TDictionary<TValue, TValue>;
  TBaseDataPair = TPair<TValue, TValue>;




Код: 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.
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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, rtti,
  System.Generics.Collections;

type
  TBaseData = TDictionary<TValue, TValue>;
  TBaseDataPair = TPair<TValue, TValue>;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    BaseData: TBaseData;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  BaseData := TBaseData.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BaseData.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  idx: integer;
begin
  idx := BaseData.Count;
  BaseData.Add(idx, 'Test' + idx.ToString);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  v: TBaseDataPair;
  s: string;
begin
  s := '';
  for v in BaseData do
    s := s + v.Key.ToString + ' = ' + v.Value.ToString + #13;
  ShowMessage(s)
end;

end.

...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986227
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Так суть в том что, тип может и с первой женой, и со второй, и с парнем за гаражом.
Это понятно
ВсеРазумный
0.000039
ВсеРазумный
Пробить отметку ниже 0.000347 не получается никак
Т.е. нативный тип дает прирост на порядок
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986228
NikolasGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
Если надо массив произвольной структуры, то стоит использовать XSuperObject.

Выглядит очень круто, я так понимаю это его GitHub https://github.com/onryldz/x-superobject
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986231
_Vasilisk_,

Но нативный тип не нужен в задачи, так что он идёт лесом.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986252
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolasGood,

Да, это оно.
Достаточно удобная весчь если надо обрабатывать стриктуры типа "кот в мешке".
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986269
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NikolasGood
Всем привет.
В PHP и других языках есть асоциативные массивы. С ними очень удобно работать. А вот в Delphi из коробки их нет. В нете есть несколько подобий их реализации, но что-то у меня ни один не заработал (Rad Studio 10.3)

Может вы знаете какую нибудь реализацию асоциативных массивов в Delphi?

Может, начать разбираться с возможностями самого Delphi, а не пытаться сделать "так, как в пэхапэ".
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986270
ъъъъъ,

Люди привыкли к хорошему, избаловались. А тут им предлагают посидеть на выпуклом месте.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986276
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный, это похоже на дедовщину - меня полгода гнобили, теперь я буду новобранцев гнобить.
переведу для тех, кто не служил - раз я заморочился и решил эту олимпиадную задачу - пусть теперь любой доразовьется до моего уровня (я - ж бог программирования!!!) и попробует ее также решить!

К чему это - в пхп это делается красиво и удобно, в дельфе из коробки решения нет, но вместо развития дельфей до уровня современных языков, вы предлагаете костыли по принципу - из того что было, то и налепила. Вот только не надо тут упоминать в суе дженерики, tdictionry<> и прочие прокладки. Дельфи в данном случае слился - факт. Опровергните красивым кодом, плз, дабы посыпать седины дельфийского программера с опытом 20 лет пеплом.
Что навеяло - вкладка Win3.1 - то есть в дельфях главное поддержать совместимость с Win3.10 90 какого-то года, нежели внедрять новые течения современных языков! А по сути - FireDac - купили сторонний, FireMonkey - энтузиазмский проект, че осталось? вкладки Win32 и win 3.1
...
Рейтинг: 0 / 0
25 сообщений из 75, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать Асоциативный многомерный массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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