2023/03/10

Delphi 11 新特性:Array 強化操作功能


今天我們來談談 Delphi XE7 開始支援的動態陣列處理,讓我們可以更輕鬆地處理陣列的新增、刪除、排序等操作。

首先,我們先來看一個簡單的例子:


 var  
  arr: array of Integer;  
  i: Integer;  
 begin  
  SetLength(arr, 3);  // 設定陣列長度  
  arr[0] := 1;     // 初始化值  
  arr[1] := 2;  
  arr[2] := 3;  
  for i := Low(arr) to High(arr) do  
   Memo1.Lines.Add(IntToStr(arr[i]));  // 在 Memo 中顯示陣列元素  

可以看到,我們直接把要初始化的值放在中括號內,並賦值給一個動態陣列變數,就完成了初始化的動作。

接下來,我們來看看動態陣列的拼接功能:

 var  
  arr1, arr2, arr3: array of Integer;  
 begin  
  arr1 := [1, 2];  
  arr2 := [3, 4];  
  arr3 := arr1 + arr2;  // 陣列拼接  

這個例子中,我們定義了三個動態陣列,arr1 和 arr2 分別包含了兩個元素,然後使用 + 符號把它們拼接成一個新的陣列 arr3。可以看到,Delphi 的動態陣列拼接功能非常方便,讓我們可以很容易地處理多個陣列的合併操作。

除了動態陣列的初始化和存取元素,Delphi 還提供了一些便利的方法來處理動態陣列。

在此之前,先來介紹一下 "TArray" 類別。

什麼是 TArray

當需要使用動態陣列時,Delphi 提供了一個方便的類別:TArray<T>。TArray<T> 實際上是一個泛型類別,其中的 T 表示要存儲的元素類別。例如,TArray<Integer> 表示一個動態整數陣列。

使用 TArray<T> 來聲明動態陣列時,可以使用 array of <T> 語法的替代方式。例如,array of Integer 可以寫成 TArray<T>。

相比傳統的動態陣列 array of,TArray<T> 具有更多的優點。例如,TArray<T> 可以與泛型集合類別一起使用,可以方便地轉換為靜態陣列,還可以簡化程式碼。

下面是一個 TArray<T> 的簡單範例,它展示了如何創建一個動態整數陣列,以及如何將兩個動態陣列進行連接:

 var  
  di: TArray<Integer>;  
  i: Integer;  
 begin  
  // 創建一個動態整數陣列  
  di := TArray<Integer>.Create(1, 2, 3);  
  // 連接兩個動態陣列  
  di := di + di; // [1,2,3] + [1,2,3] = [1,2,3,1,2,3]
  for i in di do  
  begin  
    Memo1.Lines.Add(i.ToString);  
  end;  
 end;  

上面的代碼中,TArray<Integer>.Create 創建了一個包含整數 1、2、3 的動態陣列。使用 + 操作符將兩個動態陣列連接在一起,形成一個新的動態陣列 di。

最後,使用 for in 循環遍歷 di 中的每個元素,並將其添加到 Memo1 元件中,以便輸出到使用者介面。

在使用 TArray 來管理動態陣列時,我們還可以加入排序功能,讓實體內的元素按照特定的方式進行排序。

TArray 是 Delphi 中一個非常強大的動態陣列類別,它提供了很多方便的方法來處理動態陣列。其中,排序功能就是其中之一。

要對 TArray 進行排序,我們可以使用 TArray.Sort 方法。這個方法需要一個實體作為輸入,並且可以指定一個比較器來決定排序的方式。

以下是一個對 Integer 陣列進行排序的範例:

var  
  arr: TArray<Integer>;
  i: Integer;
begin  
  arr := [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];  
  TArray.Sort<Integer>(arr);  
  // Output sorted array  
  for i := 0 to Length(arr) - 1 do  
    Memo1.Lines.Add(arr[i].ToString);  
end;  

這個範例中,我們先定義了一個 Integer 陣列,然後使用 TArray.Sort 方法對其進行排序。最後,我們遍歷陣列並輸出排序後的結果。

除了對整數陣列進行排序外,我們也可以對字串陣列進行排序。在進行字串排序時,建議使用 TStringComparer.Ordinal 作為比較器,這樣可以按照字典序對字串進行排序。以下是一個對字串陣列進行排序的範例:


uses
  System.Generics.Collections, System.Generics.Defaults;

var  
  arr: TArray<string>;
  item: string;
begin  
  arr := ['apple', 'banana', 'cat', 'dog', 'egg'];  
  TArray.Sort<string>(arr, TStringComparer.Ordinal);  
  // Output sorted array  
  for item in arr do  
    Memo1.Lines.Add(item);  
end;  

這個範例中,我們同樣先定義了一個字串陣列,然後使用 TArray.Sort 方法和 TStringComparer.Ordinal 作為比較器對其進行排序。最後,我們遍歷陣列並輸出排序後的結果。

綜上所述,TArray 提供了方便易用的排序功能,可以輕鬆地對動態陣列進行排序。在排序時,我們還可以指定比較器來控制排序方式,這樣可以滿足更多不同的排序需求。

陣列懶人包

若您想要更深入地了解動態陣列的操作與技巧,可以參考以下的程式碼範例:

 var  
  arr: array of Integer;  
  i: Integer;  
 begin  
  // 動態陣列的初始化  
  SetLength(arr, 3); // 預先指定陣列大小  
  arr[0] := 1;  
  arr[1] := 2;  
  arr[2] := 3;  
  // 動態陣列的擴充  
  SetLength(arr, Length(arr) + 2);  
  arr[3] := 4;  
  arr[4] := 5;  
  // 動態陣列的排序  
  TArray.Sort<Integer>(arr);  
  // 動態陣列的反轉  
  TArray.Reverse<Integer>(arr);  
  // 動態陣列的搜尋  
  i := TArray.BinarySearch<Integer>(arr, 2); // 搜尋數值 2 的索引  
  if i >= 0 then  
   ShowMessage('數值 2 的索引為 ' + i.ToString)  
  else  
   ShowMessage('找不到數值 2');  
  // 動態陣列的迭代  
  for i in arr do  
  begin  
   Memo1.Lines.Add(i.ToString);  
  end;  

這些範例展示了動態陣列的一些基本操作,包括初始化、擴充、排序、反轉、搜尋以及迭代。您可以根據您的需要對這些操作進行擴充和修改,以滿足不同的程式開發需求。

總結

在 Delphi 中,動態陣列是一個十分有用的工具,可以方便地操作和管理大量的資料。透過這篇文章的介紹和程式碼範例,您可以更好地了解動態陣列的使用方法和技巧,以滿足您在開發過程中的不同需求。希望這篇文章能對您有所幫助,謝謝您的閱讀!

See Also

沒有留言:

張貼留言