PDA

View Full Version : جستجو در آرایه



حمیدرضاصادقیان
دوشنبه 20 شهریور 1385, 10:16 صبح
سلام دوستان.میخواستم ببینم آیا برای پیداکردن یک مقدار در یک آرایه به جز استفاده از حلقه راه دیگری هم وجود داره؟

ghabil
دوشنبه 20 شهریور 1385, 13:18 عصر
آره خب ، بستگی داره میخوای تو چه شرایطی چه کاری رو بکنی ، مثلا خیلی وقتها بشدت می ارزه که آدم یکبار آرایش رو سورت بکنه بعد روش باینری سرچ بکنه تا سرعت سرچش لگاریتمی بره بالا...

mzjahromi
دوشنبه 20 شهریور 1385, 13:28 عصر
روشهای جستجو زیاد هستند


Binary Search
Binary Search Tree
RBTree
BTree
AvlTree
Hashing
, ...

ولی برای آرایه همونطور که دوستمون گفتن فقط اولی و آخری مورد استفاده قرار میگیرن که البته شرایطش باید محیا باشه

حمیدرضاصادقیان
دوشنبه 20 شهریور 1385, 13:44 عصر
ببینید در اصل من میخوام کار زیر رو انجام بدم.
یک گرید دارم میخوام که وقتی کاربر روی هر ردیفی کلیک کرد مقادیر اون در یک ارایه ذخیره بشه که این کارو کردم.حالا میخوام اگه کاربر دوباره روی یک ردیف کلیک کرد اگه اون ردیف در ارایه قرار داره اونو پاک کنه. که برای این به سرچ نیاز دارم.حالا اگه بخوام از حلقه استفاده کنم فرض کنید ارایه من از 0 تا 1000 است هر بار که من کلیک میکنم باید یک حلقه 1000 تایی رو بگردم.درسته که وسط کار اگه مقدار پیدا بشه میاد بیرون. ولی فکر کنم خیلی وقت میگیره.میشه از جداول temp هم استفاده کرد ولی نمیخوام از اون هم استفاده کنم چون بعضی از مشتریهای من سیستمهای ضعیفی دارن و به مشکل بر میخورن.حالا روش دیگه ایی به نظر دوستان میرسه./؟

mzjahromi
دوشنبه 20 شهریور 1385, 13:54 عصر
یکی اینکه تو این مورد زمان اونقدر زیاد نمیشه که بخوای نگرانش باشی 1000 تا رو تو یه چشم به هم زدن طی میکنه چون تو حافظه هست.
دوم
می تونی سورت کنی . تنها زمانکه خواستی اضافه یا کم کنی سورتشون کن چون کاربر در اون زمان داره فعالیت انجام میده زمان سورت هم به چشم نمیاد. در نهایت از جستجوی دودوئی برای یافتنش استفاده کن.

ghabil
دوشنبه 20 شهریور 1385, 13:57 عصر
شاید اگر از امکان Multi Select خود DbGrid استفاده کنی نیازی به تغریف آرایه هم نداشته باشی کد هم کاربر پسند تر بشه

حمیدرضاصادقیان
دوشنبه 20 شهریور 1385, 14:15 عصر
خوب از اون خاصیت استفاده کردم.ولی من نیاز دارم در پایان مقادیری که کاربر select کرده رو داشته باشم. زیرا با توجه به اونا میخوام در یک جدول دیگر مقادیری اضافه کنم. که این مقادیر در اون وجود داشته باشه.

mzjahromi
دوشنبه 20 شهریور 1385, 14:46 عصر
این کد رو ببین (http://www.swissdelphicenter.com/en/showcode.php?id=885)


function TForm1.Grid_Edit(dbgIn: TDBGrid; qryIn: TQuery): Longint;
// declared in the private section
// als private deklariert
begin
Result := 0;
with dbgIn.DataSource.DataSet do
begin
First;
DisableControls;
try
while not EOF do
begin
if (dbgIn.SelectedRows.CurrentRowSelected = True) then
begin
{ +++ Call here the data-processing function +++

+++ HIER DIE BEARBEITUNGS_FKT AUFRUFEN +++
zb. iValue := qryIn.FieldByName('FELDNAME').AsInteger;
und so weiter...
}
Inc(Result);
end;
Next;
end;
finally
EnableControls;
end;
end;
end;

ghabil
دوشنبه 20 شهریور 1385, 15:12 عصر
این کد رو ببین (http://www.swissdelphicenter.com/en/showcode.php?id=885)


function TForm1.Grid_Edit(dbgIn: TDBGrid; qryIn: TQuery): Longint;
// declared in the private section
// als private deklariert
begin
Result := 0;
with dbgIn.DataSource.DataSet do
begin
First;
DisableControls;
try
while not EOF do
begin



das is nicht optimizen
این کد که شد نقض غرض دوباره داریم روی دیتا لوپ میزنیم ، برای جلوگیری از این کار گرید خودش BookMark تعریف میکنه فقط کافیه روی دیتاست BookMarkهارو پیدا کنیم :


procedure TForm1.btnClick(Sender: TObject);
var
i: Integer;
begin
if DBGrid1.SelectedRows.Count > 0 then
begin
with DBGrid1.DataSource.DataSet do
begin
for i := 0 to DBGrid1.SelectedRows.Count-1 do
begin
GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
الان دیتاستت روی رکورد Iم انتخاب شدست هر کاری میخوای بکن با دیتاست...
end;
end;
end
end;

mzjahromi
سه شنبه 21 شهریور 1385, 11:15 صبح
درسته این کد رو همونطوری که مشاهده کردید از جای دیگه برداشتم و بررسی نکردم. ببخشید
کدی رو که خودم استفاده میکنم همونی هست که شما هم نوشتید


if DBGrid1.SelectedRows.Count>0 then
with DBGrid1.DataSource.DataSet do
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
.............................
............................
end;