【问题标题】:How do I check whether an array contains a particular value?如何检查数组是否包含特定值?
【发布时间】:2015-06-24 04:48:31
【问题描述】:

我该如何正确地写这个?:

If number is different from Array[1] to Array[x-1] the begin...... 

其中 number 是一个整数,array 是一个从 1 到 x 的整数数组

【问题讨论】:

  • 我确定我已经建议您不要使用基于 1 的数组索引。请允许我重复一下建议。
  • 另外,Array 在 Delphi 中不是有效的变量名。
  • @AndreasRejbrand 我之前也至少告诉过菲利普一次:stackoverflow.com/questions/29594762/…
  • @DavidHeffernan:我相信 Filip 在尝试编译他的代码时会注意到...
  • 创建一个函数来检查一个项目是否包含在一个数组中。例如,在我的代码库中,我会写:if not TArray.Contains(arr, value) then ...

标签: delphi


【解决方案1】:

如果在数组MyArray 中找不到number,我相信你想做点什么。然后你可以这样做:

NoMatch := True;
for i := Low(MyArray) to High(MyArray) do
  if MyArray[i] = number then
  begin
    NoMatch := False;
    Break;
  end;

if NoMatch then
  DoYourThing;

您可以创建一个函数来检查是否在数组中找到了一个数字。然后,您可以在每次需要执行此类检查时使用此功能。并且每一次,代码都将更具可读性。例如,您可以这样做:

function IsNumberInArray(const ANumber: Integer; 
  const AArray: array of Integer): Boolean;
var
  i: Integer;
begin
  for i := Low(AArray) to High(AArray) do
    if ANumber = AArray[i] then
      Exit(True);
  Result := False;
end;

...

if not IsNumberInArray(number, MyArray) then
  DoYourThing;

如果您使用旧版本的 Delphi,则必须将 Exit(True) 替换为 begin Result := True; Exit; end。在较新版本的 Delphi 中,我想您还可以使用泛型之类的东西。

【讨论】:

  • @Jens 除了您的代码与 Andreas 的代码非常不同
  • 如果您使用begin result := true; break; end; 版本,您还需要在函数开头移动result := false;。如果你使用exit; 代替break;,你可以让它在底部。
  • @Bozzy:正确。或者使用Exit 而不是Break
【解决方案2】:

您也可以编写泛型版本,但是您不能将泛型与独立过程一起使用,它们需要绑定到类或记录。类似于以下内容

unit Generics.ArrayUtils;

interface

uses
  System.Generics.Defaults;

type
  TArrayUtils<T> = class
  public
    class function Contains(const x : T; const anArray : array of T) : boolean;
  end;

implementation

{ TArrayUtils<T> }

class function TArrayUtils<T>.Contains(const x: T; const anArray: array of T): boolean;
var
  y : T;
  lComparer: IEqualityComparer<T>;
begin
  lComparer := TEqualityComparer<T>.Default;
  for y in anArray do
  begin
    if lComparer.Equals(x, y) then
      Exit(True);
  end;
  Exit(False);
end;

end.

用法是

procedure TForm6.Button1Click(Sender: TObject);
begin
  if TArrayUtils<integer>.Contains(3, [1,2,3]) then
    ShowMessage('Yes')
  else
    ShowMessage('No');
end;

应该使用 TArray&lt;integer&gt;array of integer 等参数以及常量数组(如图所示) - 您可以向类添加许多其他方法,例如 IndexOfInsert...

从 Delphi 10.3 开始,由于类型推断,您可以省略 &lt;integer&gt;,因此看起来像 TArrayUtils.Contains(3, [1,2,3])

【讨论】:

  • 需要 TArray 的东西,这非常有效。谢谢!
  • 似乎比 Andreas 的版本慢。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2020-05-24
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多