[Çözüldü]Dönen değeri dizi içindekilerle karşılaştırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

[Çözüldü]Dönen değeri dizi içindekilerle karşılaştırma

Mesaj gönderen Lord_Ares »

İnteger tipinde dönen bir bilgiyi , 0.. 300 arasında integer tipte tanımlanmış bir dizide varmı kontrolü yapmak istiyorum. Her dizideki elamanları döngüye sokup karşılaştırmanın dışında farklı bir yöntem var mı ? Mesela char tipindeki ( İn ) gibi..
char tipindekine örnek

if not (krk in ['I','Ğ','Ü','Ş','İ','Ö','Ç']) then gibi
En son Lord_Ares tarafından 18 Eyl 2016 01:54 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Dönen değeri dizi içindekilerle karşılaştırma

Mesaj gönderen ertank »

Merhaba,

Delphi 2010 ve sonrası için aşağıdaki şekilde hazır fonksiyonlardan faydalanabilirsiniz. Eğer eski sürüm bir Delphi kullanıyor iseniz sizin de bahsettiğiniz gibi for döngüsü içinde kontrol ederek geriye değer çevirmelisiniz.

Her iki durumda da kendi fonksiyonunuzu yazmanız kullanım olarak daha avantajlı olacaktır.

Kod: Tümünü seç

uses
  Generics.Collections;

function InArray(const ItemToFind: Integer; const Arr: TArray<Integer>): Boolean;
var
  InternalArray: TArray<Integer>;
  Index: Integer;
begin
  InternalArray := Arr;

  // BinarySearch özelliği sort edilmiş Array ile kullanılmalıdır.
  TArray.Sort<Integer>(InternalArray);

  Exit(TArray.BinarySearch<Integer>(InternalArray, ItemToFind, Index));
end;
Kullanımı ise aşağıdaki şekildedir.

Kod: Tümünü seç

procedure TForm15.Button1Click(Sender: TObject);
var
  MyArr: TArray<Integer>;
begin
  SetLength(MyArr, 3);
  MyArr[0] := 3;
  MyArr[1] := 1;
  MyArr[2] := 2;

  if InArray(2, MyArr) then ShowMessage('2 dizi içinde');
  if InArray(4, MyArr) then ShowMessage('4 dizi içinde');
end;
Yukarıdaki kod 2 değerini bulup, 4 değerini bulamayacaktır. Eğer ileride string değerler içinde aynı kontrolü yapmanız gerekirse aşağıdaki gibi mevcut fonksiyon kullanımını genişletebilirsiniz.

Kod: Tümünü seç

unit Unit15;

interface

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

type
  TForm15 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function InArray(const ItemToFind: Integer; const Arr: TArray<Integer>): Boolean; overload;
    function InArray(const ItemToFind: string;  const Arr: TArray<string>): Boolean; overload;
  public
    { Public declarations }
  end;

var
  Form15: TForm15;

implementation

{$R *.dfm}

function TForm15.InArray(const ItemToFind: Integer; const Arr: TArray<Integer>): Boolean;
var
  InternalArray: TArray<Integer>;
  Index: Integer;
begin
  InternalArray := Arr;

  TArray.Sort<Integer>(InternalArray);

  Exit(TArray.BinarySearch<Integer>(InternalArray, ItemToFind, Index));
end;

function TForm15.InArray(const ItemToFind: string; const Arr: TArray<string>): Boolean;
var
  InternalArray: TArray<string>;
  Index: Integer;
begin
  InternalArray := Arr;

  TArray.Sort<string>(InternalArray);

  Exit(TArray.BinarySearch<string>(InternalArray, ItemToFind, Index, TStringComparer.Ordinal));
end;

procedure TForm15.Button1Click(Sender: TObject);
var
  MyArr: TArray<Integer>;
  MyStrArr: TArray<string>;
begin
  SetLength(MyArr, 3);
  MyArr[0] := 3;
  MyArr[1] := 1;
  MyArr[2] := 2;

  if InArray(2, MyArr) then ShowMessage('2 dizi içinde');
  if InArray(4, MyArr) then ShowMessage('4 dizi içinde');

  SetLength(MyStrArr, 3);
  MyStrArr[0] := 'veli';
  MyStrArr[1] := 'ali';
  MyStrArr[2] := 'hasan';

  if InArray('ali', MyStrArr) then ShowMessage('"ali" dizi içinde mevcut');
end;

end.
NOT: Eğer Array önceden sıralanmış olursa InArray() fonksiyonları aşağıdaki şekle çevrilebilir. Ya da hiç kullanılmayıp direk Delphi fonksiyonları kullanılabilir.

Kod: Tümünü seç

function TForm15.InArray(const ItemToFind: Integer; const Arr: TArray<Integer>): Boolean;
var
  Index: Integer;
begin
  Exit(TArray.BinarySearch<Integer>(Arr, ItemToFind, Index));
end;

function TForm15.InArray(const ItemToFind: string; const Arr: TArray<string>): Boolean;
var
  Index: Integer;
begin
  Exit(TArray.BinarySearch<string>(Arr, ItemToFind, Index, TStringComparer.Ordinal));
end;
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Dönen değeri dizi içindekilerle karşılaştırma

Mesaj gönderen Lord_Ares »

Ertank emeğine ellerine sağlık. Sayenizde yeni birşey daha öğrenmiş oldum. Delphi xe10 kullanıyorum. Sanırım Delphi 2010 ve üstü sürümlerdeki yeni fonksiyonları araştırıp yakından inceleme zamanı gelmiş. :)
Cevapla