فونت زيبا سازفونت زيبا سازفونت زيبا سازفونت زيبا سازفونت زيبا سازفونت زيبا سازفونت زيبا ساز

لطفا از تمام مطالب دیدن فرمایید.

فصل چهارم ـ بخش ششم ـ ایجاد جداول قابل جستجو با Hshtable ها

تا کنون اگر می خواستید عنصری را در یک ارایه یا یک لیست پیوندی بیان کنید‍ باید اندیس عدد صحیح آن را که معرف مکان قرار گرفتن آن عنصر بود مشخص می کردید. اما اگر می خواستید برای دسترسی به آن عنصر از مقادیر دیگری به جز  اندیس استفاده کنید نم توانستید این روش را به کار ببرید. برای مثال فرض کنید در برنامه قبل می خواستید اطلاعات مشترکین را براساس آدرس پست الکترونیکی آنها بدست آورید.
در این قسمت نوع خاصی از کلکسیون ها به نام Hashtable را بررسی خواهیم کرد که روش های بهتری را برای جستجو اراپه می دهند. این کلکسیون ها بر اساس یک مقدار کلیدی که برای آن ها مشص می شود آرایه را جستجو می کنند.

استفاده از Hashtable :

Hashtable نوعی کلکسیون است که هر عنصر آن دارای یک کلید است. با استفاده از این کلید می توانید به مقدار عنصر در کلکسیون دسترسی پیدا کنید.برای مثال فرض کنید اطلاعات مشترکی با نام Darrel را که از نوع Customer است در یک  Hashtable قرار می دهید و مقدار کلیدی این عنصر را نیز برابر با دسترسی به اطلاعات این مشترک ادرس پست الکترونیکی او مشخص کنید . در این صورت اگر برای دسترسی به اطلاعات این مشترک آدرس پست الکترونیکی او را وارد کنید می توانید به سرعت او را در لیست پیدا کنید.

txt1

جستجو در یک Hashtable بسیار سریع انجام می شود. زیرا صرف نظر از نوع عنصری که در این جدول ذخیره می کنید یک عدد صحیح کوچک به عنوان شناسه عنصر در نظر گرفته می شود . در امتحان کنید بعد نحوه استفاده از Hashtable ها را مشاهده خواهیم کرد.

نکته:عدد صحیحی که برای ذخیره شناسه یک کیلید در Hashtable به کار می رود فقط ۴ بایت از حافظه را اشغال می کند . بنابراین اگر رشته شامل ۱۰۰ کارکتر را که ۲۰۰ بایت حافظه را اشغال می کند به عنوان کلید در نظر بگیرید برای جستجو در جدول فقط اعداد ۴ بایتی با یک دیگر مقایسه می شوند که باعث افزایش سرعت می شود.

امتحان کنید: استفاده از Hashtable ها

  • پروژه ای را که در بخش قبل در فصل ۴  (Structure Demo) ایجاد کرده اید را دوباره باز کنید.ویراشگر کد را برای فرم باز کده و تغییر زیر را در تعریف متغییر objCustomers ایجاد کنید:
  •  به قسمت کد های مربوط به تابع CreateCustomer بروید و کد های آن را به صورت مشخص شده در زیر تغییر دهید:
  •  به بخش کد مربوط به متد btnDelete_Click بروید و تغییرات زیر را در آن ایجاد کنید:

فصل چهارم ـ بخش ششم ـ ایجاد جداول قابل جستجو با Hshtable ها

تا کنون اگر می خواستید عنصری را در یک ارایه یا یک لیست پیوندی بیان کنید‍ باید اندیس عدد صحیح آن را که معرف مکان قرار گرفتن آن عنصر بود مشخص می کردید. اما اگر می خواستید برای دسترسی به آن عنصر از مقادیر دیگری به جز  اندیس استفاده کنید نم توانستید این روش را به کار ببرید. برای مثال فرض کنید در برنامه قبل می خواستید اطلاعات مشترکین را براساس آدرس پست الکترونیکی آنها بدست آورید.
در این قسمت نوع خاصی از کلکسیون ها به نام Hashtable را بررسی خواهیم کرد که روش های بهتری را برای جستجو اراپه می دهند. این کلکسیون ها بر اساس یک مقدار کلیدی که برای آن ها مشص می شود آرایه را جستجو می کنند.

استفاده از Hashtable :

Hashtable نوعی کلکسیون است که هر عنصر آن دارای یک کلید است. با استفاده از این کلید می توانید به مقدار عنصر در کلکسیون دسترسی پیدا کنید.برای مثال فرض کنید اطلاعات مشترکی با نام Darrel را که از نوع Customer است در یک  Hashtable قرار می دهید و مقدار کلیدی این عنصر را نیز برابر با دسترسی به اطلاعات این مشترک ادرس پست الکترونیکی او مشخص کنید . در این صورت اگر برای دسترسی به اطلاعات این مشترک آدرس پست الکترونیکی او را وارد کنید می توانید به سرعت او را در لیست پیدا کنید.

txt1

جستجو در یک Hashtable بسیار سریع انجام می شود. زیرا صرف نظر از نوع عنصری که در این جدول ذخیره می کنید یک عدد صحیح کوچک به عنوان شناسه عنصر در نظر گرفته می شود . در امتحان کنید بعد نحوه استفاده از Hashtable ها را مشاهده خواهیم کرد.

نکته:عدد صحیحی که برای ذخیره شناسه یک کیلید در Hashtable به کار می رود فقط ۴ بایت از حافظه را اشغال می کند . بنابراین اگر رشته شامل ۱۰۰ کارکتر را که ۲۰۰ بایت حافظه را اشغال می کند به عنوان کلید در نظر بگیرید برای جستجو در جدول فقط اعداد ۴ بایتی با یک دیگر مقایسه می شوند که باعث افزایش سرعت می شود.

امتحان کنید: استفاده از Hashtable ها

  • پروژه ای را که در بخش قبل در فصل ۴  (Structure Demo) ایجاد کرده اید را دوباره باز کنید.ویراشگر کد را برای فرم باز کده و تغییر زیر را در تعریف متغییر objCustomers ایجاد کنید:
  •  به قسمت کد های مربوط به تابع CreateCustomer بروید و کد های آن را به صورت مشخص شده در زیر تغییر دهید:
  •  به بخش کد مربوط به متد btnDelete_Click بروید و تغییرات زیر را در آن ایجاد کنید:
  •  به قسمت طراحی فرم برگردید و کنترل Button جدیدی را به فرم اضافه کنید . خاصیت Name‌آن را برابر با btnLookup و خاصیت Text آن را برابر Lookup قرار دهید. فرم شما در این مرحله باید مشابه شکل زیر باشد.

frm

  • بر روی دکمه ی Lookup دوبار کلیک کنید تا متد مربوط به رویداد click آن ایجاد شود.سپس کد های زیر را به این متد اضافه کنید:
  •  برنامه را اجرا کنید و بر روی دکمه Test کلیک کنید تا لیست از نام مشترکین پر شود. اگر یک آدرس پست الکتررونیکی که در لیست وجود ندارد را در بخش Email وارد کنید و بر روی دکمه  Lookup کلیک کنید کادرپیغامی را مشابه شکل زیر مشاهده خواهید کرد.

msg

  • اگر یک آدرس پست الکترونیکی که در لیست وجود دارد٬ برای مثال dhilton@somecompany.com را در قسمت
    Email وارد کنید و دکمه Lookup را فشار دهید مشاهده خواهید کرد که نام فرد در کادر پیغام نمایش داده می شود.

چگونه کار می کند؟؟

برای ایجاد یک HashTable ٬ تعریف متغییر objCustomers را به صورت زیر تغییر می دهیم:
 به این ترتیب نوع داده ای متغییر objCustomers ٬ از نوع HashTable خواهد بود و عناصر ایجاد شده در متد CreateCustomer به جای ذخیره شدن در Array List در یک HashTable ذخیره می شوند.

txt2

 برای حذف یک آیتم از HashTable باید کلید ان را که همان ادرس پست الکترونیکی است مشخص کنید.
 نکته:برای جلوگیری از حساسیت نصبت به نوع حروف به هنگام اضافه  یک آیتم به HashTable ابتدا تمام حروف آدرس پست الکترونیکی را با استفاده از تابع ToLower به حروف کوچک تبدیل می کنیم‌٬ سپس رشته جدید را به عنوان کلید آرایه را در نظر می گیریم.

txt3

 برای دسترسی به این آیتم می توانیم همانند دسترسی به عناصر در یک آرایه عمل می کنیم و جای استفاده از یک عدد صحیح٬ از کلید که در اینجا همان آدرس پست الکترونیکی است به عنوان اندیس استفاده کنیم:
 تمام آیتم های قبل از این که در HashTable ذخیره شوند٬ به شیٔ از کلاس Object تبدیل شوند. بنابراین بعد از این که با استفاده از کلید٬ مکان آن ها را در آرایه پیدا کردیم٬ قبل از استفاده باید آنها را به نوع داده ای اصلی خود تبدیل کنیم.همان طور که در قبل گفتم برای اینکه یک متغییر  را به نوع داده ای دیگری تبدیل کنیم باید از عملگر () استفاده کنیم. در این قسمت برای تبدیل آیتم ذخیره شده در HashTable از نوع Object به نوع Customer به صورت زیر عمل می کنیم:
 حال می توانیم با استفاده از خاصیت Name نام مربوط به مشترک را در کادر پیغام نمایش دهیم.

جلوگیری از وارد شدن عناصر تکراری :

همانطور که می دانید از یک کلید نمی توان دوبار در یک HashTable استفاده کرد. این کار باعث  به وجود آمدن خطا در زمان اجرای برنامه می شود.به همین دلیل باید قبل از اینکه عنصری را به یک HashtTable اضافه کنیم٬ از منحصر به فرد بودن آن مطمئن شویم .در بخش امتحان کنید بعد٬ چگ.نگی جلوگیری از این خطا در برنامه را خواهید دید.

امتحان کنید: جلوگیری از وارد شدن عناصر تکراری

  • برای مشاهده اینکه در صورت وارد کردن کلید تکراری به HashTable چگونه خطا ایجاد می شود برنامه را اجرا کنید و روی دکمه Test کلیک کنید تا لیست مشترکین پر شود.حال مجددا بر روی دکمه فرمان Test‌کلیک کنید پنجره خطایی را مشابه شکل زیر مشاهده خواهید کرد.
eror
  • بر روی دکمه ی Stop Debugging در نوار ابزار ویژوال استودیو کلیک کنید تا اجرای برنامه متوقف شود.
  • ویرایشگر کد را برای Form1 باز کنید و محل متد CreateCustomer بروید. کد زیر را به این متد اضافه کنید تا هر بار قبل از اینکه مشترک به لیست اضافه شود از عدم وجود آن در لیست مطمئن شویم:
  •  مجددا برنامه را اجرا کنید و بر روی دکمه ی Test کلیک کنید تا لیست مشترکین کامل شود.
  • حال دوباره روی دکمه ی Test کلیک کنید. مضاهده خواهید کرد هنگامی که بخواهید مشترکی را برای بار دوم به لیست وارد کنید٬ در کادر پیغام نمایش داده می شود که مشترک هم اکنون در لیست وجود دارد و نمی توانید آن را مجددا به لیست اضافه کنید

لینک دانلود پروژه Structure Demo

چگونه کار می کند؟؟

همانطور که مشاهده می کنید برای با دوم که برنامه را اجرا می کنید با خطا مواجه نمی شوید. دلیل ان نیز مشخص است. زیرا در اجرا دوم  برنامه فقط در صورتی یک ایتم به لیست اضافه می شود که کلید آن درجدول وجود نداشته باشد. در این صورت اگر کلید ایتم را به عنوان پارامتر به تابع Conains بفرستیم٬ تابع مقدار false را برگردانده و برنامه آیتم را به لیست اضافه می کند:
 اگر تابع contains مقدار true‌را بر می گیرداند٬ می توان نتیجه گرفت که آیتم در لیست وجود داشته است. پس با نمایش یک کادر پیغام مورد را به اطلا کاربر می رسانیم و از تابع خارج می شویم.

 امیدوارم از آموزش خوشتون اومده باشه(نظر در مورد نحوه آموزش یادتون نره)


برچسب‌ها:

تاريخ : چهارشنبه 29 مرداد 1393 | 08:14 | نویسنده : کـــــوچـــــولـــــو | ارسال نظر(0)

لطفا از دیگر مطالب نیز دیدن فرمایید
.: Weblog Themes By SlideTheme :.
💬 نظرات کاربران
💬ثبت نام کاربران
💬ورود کاربران

Flying Icon