如何使用Delphi

时间:2019-06-11 11:07:57

标签: arrays delphi

我有一个二维数组,需要根据特定条件进行扩展。

数组可以增长,包括第一个存在的行和/或最后一个存在的行,与列相同。

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

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

所需的示例如下: 原始阵列(4x6):

array table with data

Ejemplo de crecimiento: Desde(4x6)a(8x7):

new array table with data

Python示例:

array pad with Python

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

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

场景如下:我们有一个特定区域的数据,被网格划分,每个数据代表网格中一个单元格的值。随后,从位于相同扇区但大小较大的另一个区域获得新数据。为了表示获得的所有数据,定义了一个覆盖整个采样区域的网格,即,网格的边缘由每个区域的外部位置定义,从而使网格表示所有区域的周围矩形。 / p>

每个网格的每个单元代表一个固定的地理位置,因此它必须保持在相同的地理位置,而与包含它们的网格的大小无关。代表整个采样区域的网格值表示在相同地理位置的采样值之间的数学运算。这意味着由于每个网格都存储在代表每个采样位置的数组中,因此数组必须增长的事件。

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

1 个答案:

答案 0 :(得分:0)

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

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

[{"score":15,"win":true,"device":"Android SDK built for x86"},{"score":"Finish","device":"Android SDK built for x86","win":true},{"win":true,"score":"Finish","device":"Android SDK built for x86"},{"score":16,"scenario":"Finish","win":true,"device":"Android SDK built for x86"}]

读取/更改TLists矩阵就像数组一样简单。元素(i,j)是:

TObjectList<TList<integer>>

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

Matrix[i][j]

最后是:

Matrix.Insert(0, TList<integer>.Create);

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

Matrix.Add(TList<integer>.Create);

在末尾添加它们是:

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

请记住,最后您将需要释放这些对象。

var Row: TList<integer>;
begin
  for Row in Matrix do Row.Add(0);
end;

我创建了一个示例项目对其进行测试。这是dfm:

Matrix.Free;

和代码:

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