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

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

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

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

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

И это очень быстро работает, особенно в связке с миллион функций для сортировки этих массивов.
...
Рейтинг: 0 / 0
03.08.2020, 15:44
    #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
03.08.2020, 16:04
    #39986162
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
Если надо массив произвольной структуры, то стоит использовать XSuperObject.
...
Рейтинг: 0 / 0
03.08.2020, 16:10
    #39986168
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
ВсеРазумный
В PHP массивы это Ключ (Строка \ Число) => Любое значение.


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

Лучше уж TValue чем этот Variant
...
Рейтинг: 0 / 0
03.08.2020, 16:13
    #39986171
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
ВсеРазумный,
TValue - тормоз.
...
Рейтинг: 0 / 0
03.08.2020, 16:14
    #39986174
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
...
Рейтинг: 0 / 0
03.08.2020, 17:06
    #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
03.08.2020, 18:12
    #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
03.08.2020, 18:33
    #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
03.08.2020, 18:55
    #39986216
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
ВсеРазумный
Пробить отметку ниже 0.000347 не получается никак
А если
Код: pascal
1.
2.
var
  A, b, C: Extended;

?
...
Рейтинг: 0 / 0
03.08.2020, 18:58
    #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
03.08.2020, 19:01
    #39986220
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
ВсеРазумный, любая древовидная структура данных автору подходит.

Возможно подойдет и JSonDocument, XmlDocument но если нужна будет быстрая навигация
по известному "path" то надо смотреть какая структура внутри. Не везде хеш-табличка
в основе.
...
Рейтинг: 0 / 0
03.08.2020, 19:12
    #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
03.08.2020, 19:23
    #39986227
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
ВсеРазумный
Так суть в том что, тип может и с первой женой, и со второй, и с парнем за гаражом.
Это понятно
ВсеРазумный
0.000039
ВсеРазумный
Пробить отметку ниже 0.000347 не получается никак
Т.е. нативный тип дает прирост на порядок
...
Рейтинг: 0 / 0
03.08.2020, 19:24
    #39986228
NikolasGood
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать Асоциативный многомерный массив
rgreat
Если надо массив произвольной структуры, то стоит использовать XSuperObject.

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

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

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

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

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

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

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


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