Arrays 如何用Delphi填充二维数组的行和列

Arrays 如何用Delphi填充二维数组的行和列,arrays,delphi,Arrays,Delphi,我有一个二维数组,需要根据特定条件进行增长 数组可以增长,包括第一个现有行之前和/或最后一个现有行之后的新行,列也是如此 数组的值表示网格行和列之间的固定物理位置,因此当数组增长时,现有值必须保持在相同的物理位置,但在数组中有一个新位置 我已经找到了一些Java和Python的示例,但是这些示例使用的库没有访问它们的源代码,因此我无法复制使用的算法 所需的一个例子是: 原始阵列(4x6): 埃杰姆波·德克里西门托: Desde(4x6)a(8x7): Python的一个示例: 说明: 数组

我有一个二维数组,需要根据特定条件进行增长

数组可以增长,包括第一个现有行之前和/或最后一个现有行之后的新行,列也是如此

数组的值表示网格行和列之间的固定物理位置,因此当数组增长时,现有值必须保持在相同的物理位置,但在数组中有一个新位置

我已经找到了一些Java和Python的示例,但是这些示例使用的库没有访问它们的源代码,因此我无法复制使用的算法

所需的一个例子是: 原始阵列(4x6):

埃杰姆波·德克里西门托: Desde(4x6)a(8x7):

Python的一个示例:

说明: 数组将增长四行,两行在第一个原始[0,0]之前,两行在最后一个原始[3,0]之后,一列在第一个原始列之前,这将两个值的新位置定义为:[0.0]到[2,1]和[3,0]到[5,1]

数组的每个元素都表示一个double类型的值,但这与设计无关,因为可以为每个元素使用另一种类型的数据

场景如下:我们有来自特定区域的数据,被网格分割,每个数据代表网格中一个单元格的值。随后,从位于同一扇区但面积较大的另一个区域获得新数据。为了表示获得的所有数据,定义了一个覆盖整个采样区域的网格,也就是说,网格的边缘由每个区域的外部位置定义,网格表示所有区域的周围矩形

每个网格的每个单元格表示一个固定的地理位置,因此它必须保持在相同的地理位置,而不受包含它们的网格大小的影响。表示整个采样区域的网格值表示相同地理位置的采样值之间的数学运算。这意味着阵列必须增长,因为每个栅格存储在表示每个采样位置的阵列中


这意味着位于采样网格特定位置(单元)的值在网格中具有代表整个采样区域的不同索引的位置;每个网格都有自己的左角0,0。

实现这一点的一种方法是使用列表而不是数组,因此您可以在这些列表的开头和结尾插入行和列。为了简化代码,我使用泛型(Delphi2009和posteriors)提供了解决方案

这与您使用数组数组的方式非常相似。您的矩阵类型将是(根据Andreas的建议,我已将外部TList替换为TObjectList,因此您不需要手动释放内部TList):

要在开始时添加行,请使用:

Matrix.Insert(0, TList<integer>.Create);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Insert(0, 0);
end;
我创建了一个示例项目来测试它。这是dfm:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 48
    Top = 141
    Width = 21
    Height = 13
    Caption = 'Row'
  end
  object Label2: TLabel
    Left = 119
    Top = 141
    Width = 15
    Height = 13
    Caption = 'Col'
  end
  object btnAddRowStart: TButton
    Left = 38
    Top = 32
    Width = 96
    Height = 25
    Caption = 'Add Row at Start'
    TabOrder = 0
    OnClick = btnAddRowStartClick
  end
  object btnAddRowEnd: TButton
    Left = 38
    Top = 63
    Width = 96
    Height = 25
    Caption = 'Add Row at End'
    TabOrder = 1
    OnClick = btnAddRowEndClick
  end
  object btnAddColStart: TButton
    Left = 145
    Top = 32
    Width = 96
    Height = 25
    Caption = 'Add Col at Start'
    TabOrder = 2
    OnClick = btnAddColStartClick
  end
  object btnAddColEnd: TButton
    Left = 145
    Top = 63
    Width = 96
    Height = 25
    Caption = 'Add Colt at End'
    TabOrder = 3
    OnClick = btnAddColEndClick
  end
  object btnReadValue: TButton
    Left = 207
    Top = 158
    Width = 75
    Height = 25
    Caption = 'Read Value'
    TabOrder = 6
    OnClick = btnReadValueClick
  end
  object btnSetValue: TButton
    Left = 207
    Top = 189
    Width = 75
    Height = 25
    Caption = 'Set Value'
    TabOrder = 7
    OnClick = btnSetValueClick
  end
  object txtRow: TEdit
    Left = 48
    Top = 160
    Width = 65
    Height = 21
    TabOrder = 4
    Text = '1'
  end
  object txtCol: TEdit
    Left = 119
    Top = 160
    Width = 66
    Height = 21
    TabOrder = 5
    Text = '1'
  end
  object txtReadValue: TEdit
    Left = 296
    Top = 160
    Width = 65
    Height = 21
    Enabled = False
    TabOrder = 8
    Text = '1'
  end
  object txtSetValue: TEdit
    Left = 296
    Top = 191
    Width = 65
    Height = 21
    TabOrder = 9
    Text = '1'
  end
end
以及守则:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btnAddRowStart: TButton;
    btnAddRowEnd: TButton;
    btnAddColStart: TButton;
    btnAddColEnd: TButton;
    Label1: TLabel;
    Label2: TLabel;
    btnReadValue: TButton;
    btnSetValue: TButton;
    txtRow: TEdit;
    txtCol: TEdit;
    txtReadValue: TEdit;
    txtSetValue: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure btnAddRowStartClick(Sender: TObject);
    procedure btnAddRowEndClick(Sender: TObject);
    procedure btnAddColStartClick(Sender: TObject);
    procedure btnAddColEndClick(Sender: TObject);
    procedure btnReadValueClick(Sender: TObject);
    procedure btnSetValueClick(Sender: TObject);
  private
    Matrix: TObjectList<TList<integer>>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Matrix := TObjectList<TList<integer>>.Create;
end;

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

procedure TForm1.btnReadValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  txtReadValue.Text := Matrix[i][j].ToString;
end;

procedure TForm1.btnSetValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  Matrix[i][j] := StrToInt(txtSetValue.Text);
end;

procedure TForm1.btnAddRowStartClick(Sender: TObject);
begin
  Matrix.Insert(0, TList<integer>.Create);
end;

procedure TForm1.btnAddRowEndClick(Sender: TObject);
begin
  Matrix.Add(TList<integer>.Create);
end;

procedure TForm1.btnAddColStartClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Insert(0, 0);
end;

procedure TForm1.btnAddColEndClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Add(0);
end;

end.
单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、Vcl.stdctrl、System.Generics.Collections;
类型
TForm1=类(TForm)
btnAddRowStart:t按钮;
btnAddRowEnd:t按钮;
btnAddColStart:t按钮;
btnaddclond:t按钮;
标签1:TLabel;
标签2:TLabel;
btnReadValue:TButton;
btnSetValue:t按钮;
txtRow:TEdit;
txtCol:TEdit;
txtReadValue:TEdit;
txtSetValue:TEdit;
过程表单创建(发送方:ToObject);
程序btnAddRowStartClick(发送方:TObject);
程序btnAddRowEndClick(发送方:TObject);
程序btnAddColStartClick(发送方:TObject);
程序btnaddclondclick(发送方:TObject);
过程btnReadValueClick(发送者:ToObject);
程序BTNSETVALUE点击(发送方:TObject);
私有的
矩阵:TObjectList;
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
过程TForm1.FormCreate(发送方:TObject);
开始
矩阵:=TObjectList.Create;
结束;
程序TForm1.FormDestroy(发送方:ToObject);
开始
自由矩阵;
结束;
过程TForm1.btnReadValueClick(发送方:ToObject);
var i,j:整数;
开始
i:=stroint(txtRow.Text);
j:=stroint(txtCol.Text);
Text:=矩阵[i][j].ToString;
结束;
程序TForm1.btnSetValueClick(发送方:TObject);
var i,j:整数;
开始
i:=stroint(txtRow.Text);
j:=stroint(txtCol.Text);
矩阵[i][j]:=stroint(txtSetValue.Text);
结束;
程序TForm1.btnAddRowStartClick(发送方:TObject);
开始
插入矩阵(0,TList.Create);
结束;
程序TForm1.btnAddRowEndClick(发送方:TObject);
开始
Matrix.Add(TList.Create);
结束;
过程TForm1.btnAddColStartClick(发送方:TObject);
var行:TList;
开始
对于矩阵中的行,插入(0,0);
结束;
过程TForm1.btnaddclondclick(发送方:TObject);
var行:TList;
开始
对于矩阵中的行,添加(0);
结束;
结束。

实现这一点的一种方法是使用列表而不是数组,这样您就可以在列表的开头和结尾插入行和列。为了简化代码,我使用泛型(Delphi2009和posteriors)提供了解决方案

这与您使用数组数组的方式非常相似。您的矩阵类型将是(根据Andreas的建议,我已将外部TList替换为TObjectList,因此您不需要手动释放内部TList):

要在开始时添加行,请使用:

Matrix.Insert(0, TList<integer>.Create);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Insert(0, 0);
end;
我创建了一个示例项目来测试它。这是dfm:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 48
    Top = 141
    Width = 21
    Height = 13
    Caption = 'Row'
  end
  object Label2: TLabel
    Left = 119
    Top = 141
    Width = 15
    Height = 13
    Caption = 'Col'
  end
  object btnAddRowStart: TButton
    Left = 38
    Top = 32
    Width = 96
    Height = 25
    Caption = 'Add Row at Start'
    TabOrder = 0
    OnClick = btnAddRowStartClick
  end
  object btnAddRowEnd: TButton
    Left = 38
    Top = 63
    Width = 96
    Height = 25
    Caption = 'Add Row at End'
    TabOrder = 1
    OnClick = btnAddRowEndClick
  end
  object btnAddColStart: TButton
    Left = 145
    Top = 32
    Width = 96
    Height = 25
    Caption = 'Add Col at Start'
    TabOrder = 2
    OnClick = btnAddColStartClick
  end
  object btnAddColEnd: TButton
    Left = 145
    Top = 63
    Width = 96
    Height = 25
    Caption = 'Add Colt at End'
    TabOrder = 3
    OnClick = btnAddColEndClick
  end
  object btnReadValue: TButton
    Left = 207
    Top = 158
    Width = 75
    Height = 25
    Caption = 'Read Value'
    TabOrder = 6
    OnClick = btnReadValueClick
  end
  object btnSetValue: TButton
    Left = 207
    Top = 189
    Width = 75
    Height = 25
    Caption = 'Set Value'
    TabOrder = 7
    OnClick = btnSetValueClick
  end
  object txtRow: TEdit
    Left = 48
    Top = 160
    Width = 65
    Height = 21
    TabOrder = 4
    Text = '1'
  end
  object txtCol: TEdit
    Left = 119
    Top = 160
    Width = 66
    Height = 21
    TabOrder = 5
    Text = '1'
  end
  object txtReadValue: TEdit
    Left = 296
    Top = 160
    Width = 65
    Height = 21
    Enabled = False
    TabOrder = 8
    Text = '1'
  end
  object txtSetValue: TEdit
    Left = 296
    Top = 191
    Width = 65
    Height = 21
    TabOrder = 9
    Text = '1'
  end
end
以及守则:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btnAddRowStart: TButton;
    btnAddRowEnd: TButton;
    btnAddColStart: TButton;
    btnAddColEnd: TButton;
    Label1: TLabel;
    Label2: TLabel;
    btnReadValue: TButton;
    btnSetValue: TButton;
    txtRow: TEdit;
    txtCol: TEdit;
    txtReadValue: TEdit;
    txtSetValue: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure btnAddRowStartClick(Sender: TObject);
    procedure btnAddRowEndClick(Sender: TObject);
    procedure btnAddColStartClick(Sender: TObject);
    procedure btnAddColEndClick(Sender: TObject);
    procedure btnReadValueClick(Sender: TObject);
    procedure btnSetValueClick(Sender: TObject);
  private
    Matrix: TObjectList<TList<integer>>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Matrix := TObjectList<TList<integer>>.Create;
end;

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

procedure TForm1.btnReadValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  txtReadValue.Text := Matrix[i][j].ToString;
end;

procedure TForm1.btnSetValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  Matrix[i][j] := StrToInt(txtSetValue.Text);
end;

procedure TForm1.btnAddRowStartClick(Sender: TObject);
begin
  Matrix.Insert(0, TList<integer>.Create);
end;

procedure TForm1.btnAddRowEndClick(Sender: TObject);
begin
  Matrix.Add(TList<integer>.Create);
end;

procedure TForm1.btnAddColStartClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Insert(0, 0);
end;

procedure TForm1.btnAddColEndClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Add(0);
end;

end.
单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、Vcl.stdctrl、System.Generics.Collections;
类型
TForm1=类(TForm)
btnAddRowStart:t按钮;
Btnadrowen
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btnAddRowStart: TButton;
    btnAddRowEnd: TButton;
    btnAddColStart: TButton;
    btnAddColEnd: TButton;
    Label1: TLabel;
    Label2: TLabel;
    btnReadValue: TButton;
    btnSetValue: TButton;
    txtRow: TEdit;
    txtCol: TEdit;
    txtReadValue: TEdit;
    txtSetValue: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure btnAddRowStartClick(Sender: TObject);
    procedure btnAddRowEndClick(Sender: TObject);
    procedure btnAddColStartClick(Sender: TObject);
    procedure btnAddColEndClick(Sender: TObject);
    procedure btnReadValueClick(Sender: TObject);
    procedure btnSetValueClick(Sender: TObject);
  private
    Matrix: TObjectList<TList<integer>>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Matrix := TObjectList<TList<integer>>.Create;
end;

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

procedure TForm1.btnReadValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  txtReadValue.Text := Matrix[i][j].ToString;
end;

procedure TForm1.btnSetValueClick(Sender: TObject);
var i, j: integer;
begin
  i := StrToInt(txtRow.Text);
  j := StrToInt(txtCol.Text);

  Matrix[i][j] := StrToInt(txtSetValue.Text);
end;

procedure TForm1.btnAddRowStartClick(Sender: TObject);
begin
  Matrix.Insert(0, TList<integer>.Create);
end;

procedure TForm1.btnAddRowEndClick(Sender: TObject);
begin
  Matrix.Add(TList<integer>.Create);
end;

procedure TForm1.btnAddColStartClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Insert(0, 0);
end;

procedure TForm1.btnAddColEndClick(Sender: TObject);
var Row: TList<integer>;
begin
  for Row in Matrix do Row.Add(0);
end;

end.