Arrays 如何用Delphi填充二维数组的行和列
我有一个二维数组,需要根据特定条件进行增长 数组可以增长,包括第一个现有行之前和/或最后一个现有行之后的新行,列也是如此 数组的值表示网格行和列之间的固定物理位置,因此当数组增长时,现有值必须保持在相同的物理位置,但在数组中有一个新位置 我已经找到了一些Java和Python的示例,但是这些示例使用的库没有访问它们的源代码,因此我无法复制使用的算法 所需的一个例子是: 原始阵列(4x6): 埃杰姆波·德克里西门托: Desde(4x6)a(8x7): Python的一个示例: 说明: 数组将增长四行,两行在第一个原始[0,0]之前,两行在最后一个原始[3,0]之后,一列在第一个原始列之前,这将两个值的新位置定义为:[0.0]到[2,1]和[3,0]到[5,1] 数组的每个元素都表示一个double类型的值,但这与设计无关,因为可以为每个元素使用另一种类型的数据 场景如下:我们有来自特定区域的数据,被网格分割,每个数据代表网格中一个单元格的值。随后,从位于同一扇区但面积较大的另一个区域获得新数据。为了表示获得的所有数据,定义了一个覆盖整个采样区域的网格,也就是说,网格的边缘由每个区域的外部位置定义,网格表示所有区域的周围矩形 每个网格的每个单元格表示一个固定的地理位置,因此它必须保持在相同的地理位置,而不受包含它们的网格大小的影响。表示整个采样区域的网格值表示相同地理位置的采样值之间的数学运算。这意味着阵列必须增长,因为每个栅格存储在表示每个采样位置的阵列中Arrays 如何用Delphi填充二维数组的行和列,arrays,delphi,Arrays,Delphi,我有一个二维数组,需要根据特定条件进行增长 数组可以增长,包括第一个现有行之前和/或最后一个现有行之后的新行,列也是如此 数组的值表示网格行和列之间的固定物理位置,因此当数组增长时,现有值必须保持在相同的物理位置,但在数组中有一个新位置 我已经找到了一些Java和Python的示例,但是这些示例使用的库没有访问它们的源代码,因此我无法复制使用的算法 所需的一个例子是: 原始阵列(4x6): 埃杰姆波·德克里西门托: Desde(4x6)a(8x7): Python的一个示例: 说明: 数组
这意味着位于采样网格特定位置(单元)的值在网格中具有代表整个采样区域的不同索引的位置;每个网格都有自己的左角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.