少しだけ便利な配列を作ろう その2(整数値)

少しだけ便利な配列を作ろう その1 では、要素の型が string である配列を作成しました。ここでは Integer 型 を要素とする配列を作成してみます。

文字列の場合には TStringList という大変便利なクラスを利用しましたが、 今回作成する配列の要素は、Integer 型ですので、TList クラスを用いて作成していきます。

ここでは、TIntArray クラスを作成し、以下のメソッドを持たせます。

Push
配列の末尾に要素を追加します
Pop
末尾の要素を取り出します
UnShift
配列の先頭に要素を追加します
Shift
先頭の要素を取り出します
unit Unit2;

interface

uses Classes, SysUtils;

type
  TIntArray = class
  private
    fList: TList;
    function GetItem(index: Integer): Integer;
    procedure SetItem(index: Integer; const Value: Integer);
    procedure ItemClear;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    function GetCount: Integer;
    procedure Push(Item: Integer);
    function Pop: Integer;
    procedure UnShift(Item: Integer);
    function Shift: Integer;
    property Items[index: Integer]: Integer read GetItem write SetItem; default;
  end;

implementation

{ TIntArray }

procedure TIntArray.Clear;
begin
  ItemClear;
  fList.Clear;
end;

constructor TIntArray.Create;
begin
  fList := TList.Create;
end;

destructor TIntArray.Destroy;
begin
  ItemClear;
  fList.Free;
  inherited;
end;

function TIntArray.GetCount: Integer;
begin
  Result := fList.Count;
end;

function TIntArray.GetItem(index: Integer): Integer;
begin
  Result := PInteger(fList.Items[index])^;
end;

procedure TIntArray.ItemClear;
var
  i: Integer;
begin
  for i := 0 to fList.Count-1 do
    Dispose(PInteger(fList.Items[i]));
end;

function TIntArray.Pop: Integer;
var
  Int: Integer;
  LastIndex: Integer;
begin
  if fList.Count = 0 then
    raise Exception.Create('インデックスを超えています');

  LastIndex := fList.Count-1;
  Int := PInteger(fList.Items[LastIndex])^;
  Result := Int;
  Dispose(PInteger(fList.Items[LastIndex]));
  fList.Delete(LastIndex);
end;

procedure TIntArray.Push(Item: Integer);
var
  pInt: PInteger;
begin
  New(pInt);
  pInt^ := Item;
  fList.Add(pInt);
end;

procedure TIntArray.SetItem(index: Integer; const Value: Integer);
begin
  PInteger(fList.Items[index])^ := Value;
end;

function TIntArray.Shift: Integer;
var
  Int: Integer;
begin
  if fList.Count = 0 then
    raise Exception.Create('インデックスを超えています');

  Int := PInteger(fList.Items[0])^;
  Result := Int;
  Dispose(PInteger(fList.Items[0]));
  fList.Delete(0);
end;

procedure TIntArray.UnShift(Item: Integer);
var
  pInt: PInteger;
begin
  New(pInt);
  pInt^ := Item;
  fList.Insert(0, pInt);
end;

end.

Unit1 について

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Unit2;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    SpinEdit1: TSpinEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
    IntArray: TIntArray;
  public
    { Public 宣言 }
    procedure DisplayList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DisplayList;
var
  i: Integer;
begin
  ListBox1.Clear;

  if IntArray.GetCount = 0 then
  begin
    ListBox1.Items.Add('リストはカラです');
    exit;
  end;

  for i := 0 to IntArray.GetCount-1 do
    ListBox1.Items.Add(IntToStr(IntArray[i]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption := 'Push';
  Button2.Caption := 'Pop';
  Button3.Caption := 'UnShift';
  Button4.Caption := 'Shift';

  IntArray := TIntArray.Create;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  IntArray.Push(SpinEdit1.Value);
  DisplayList;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(IntToStr(IntArray.Pop) + ' を取り出しました');
  DisplayList;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  IntArray.UnShift(SpinEdit1.Value);
  DisplayList;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ShowMessage(IntToStr(IntArray.Shift) + ' を取り出しました');
  DisplayList;
end;

end.

エラー処理は、シンプルにしてあります。


up next
Last update: 2003/3/5