пятница, 26 октября 2012 г.

Assocative arrays in Pascal

Привет.

Внезапно понадобились ассоциативные массивы в паскале ( Free Pascal ).

Надо было из 10^5 чисел быстро находить количество повторов определенного числа. Это нужно делать по ходу ввода этих чисел.

Я хотел создать массив, где индекс будет числом, а значение элемента - количеством повторов этого числа.

Только вот проблема: число может быть от 1 до 10^13.
То есть нужен массив на 10^13 элементов.
Так как паскаль при создании массива забивает его нулями то, ясное дело, ему не хватит памяти создать такой массив.

Ладно, думаю я, в паскале же есть динамические массивы!
Оказывается, что вся их динамичность заключается в том, что я могу по ходу дела изменять длину массива!
В моем понимании, динамический массив должен делать следующее:
array[ 0 ] = 1;
array[ 1000000 ] = 2;

И промежуточных элементов быть не должно. Но это же паскаль.

Как бы я сделал это на Javascript/ActionScript 3.0?

var list = {};
list[ 10000000000000 ] = 1;

Хорошо. Хочу такое же на паскале. Гуглим, узнаем, что в ECMAScript ( основа Javascript и ActionScript 3.0 ) объекты  - это ассоциативные массивы. В этой же статье есть пример на Delphi. Руководствуясь правилом: что есть в Delphi, то есть и в Pascal, пишем примерчик:
{$MODE OBJFPC}
uses
 Classes, SysUtils;

var list : TStringList;
begin
 list := TStringList.Create;
 list.CommaText := '123=42, a=45';
 writeln( list.values[ 'a' ] ); // 45
end.

Единственное, что не есть хорошо - мы можем в качестве индекса и значения использовать только строку. Но мы можем в качестве значения хранить индекс массива, в котором мы будем хранить объекты или что-нибудь еще. Конечно, теперь индекс может быть любым.
То есть
a[ '12315315641651' ] = '26';
b[ 26 ] = myAwesomeObject;

Комментариев нет:

Отправить комментарий