با حمایت ما%۵
تخفیف بگیرد

logo-samandehi

برنامه نويسي اندرويد 6 - برنامه نویسی جاوا - مقدماتی 2

Array * ها :

عناصری به نام array همیشه در برنامه نویسی وجود داشته اند که بدون آنها نوشته برنامه ها گاهاً خیلی دشوار خواهد شد. اما نباید سادگی استفاده از آنها باعث شود از روشها غلط در کد نویسی استفاده کنید. در جاوا هم array وجود دارد و هم کلاسهایی زیر کلاس Collection، از جمله ArrayList. به کد زیر توجه کنید:


  1. package com.uncocoder.course.lessons.array;
  2.  
  3. import android.util.Log;
  4.  
  5. public class ArrayTest {
  6.  
  7.     public static byte[] fillArray(int count) {
  8.         byte[] bytes = new byte[count];
  9.         for (int i = 0; i < bytes.length; i++) {
  10.             bytes[i] = (byte) (Math.random() * 100);
  11.         }
  12.  
  13.         return bytes;
  14.     }
  15.  
  16.  
  17.  
  18.     public static void dumpArray(byte[] bytes) {
  19.         for (int i = 0; i < bytes.length; i++) {
  20.             Log.i("LOG", "Byte #" + i + " is " + bytes[i]);
  21.         }
  22.     }
  23.  
  24.  
  25.  
  26.     public static byte[] copyBytes(byte[] bytes) {
  27.         byte[] destBytes = new byte[bytes.length];
  28.         for (int i = 0; i < bytes.length; i++) {
  29.             destBytes[i] = bytes[i];
  30.         }
  31.  
  32.         return destBytes;
  33.     }
  34. }

 

 

خط 7 تا 13: یک متد static و public تعریف شده است. بنابراین بدون ساختن instance ـی از این کلاس می توان از هر کلاسی آنرا به شکل ArrayTest.fillArray صدا زد. این متد یک ورودی عدد دارد و یک خروجی از نوع array ـی از بایتها. در داخل متد ابتدا به اندازه ورودی متد عناصر byte را می سازیم، به عبارت دیگر یک byte array می سازیم که دارای count المان است. سپس به اندازه تعداد این array اعداد تصادفی بین 0 تا 99 را ساخته و به ترتیب به عناصر byte array اختصاص می دهیم. توجه کنید که عناصر array از عدد 0 شروع می شود که به آن index می گویند. مثلاً index سوم عدد چهارم از array را بدست می دهد.

خط 18 تا 22: یک ورودی از نوع byte array دریافت می کنیم و تک تک عناصر آنرا چاپ می کنیم. این متد مقدار خروجی ندارد.

خط 26 تا 33: یک byte array به عنوان ورودی دریافت می کنیم. یک byte array دیگر با تعداد المانی برابر تعداد المانهای byte array ورودی می سازیم و تک تک عناصر byte array وارد شده را به ترتیب به عناصر byte array جدید کپی می کنیم. پس از اتمام حلقه for دقیقاً یک byte array مثل byte array ورودی داریم که آن را از متد خارج می کنیم.

 

حالا برای تست کلاس بالا می توانید از همان Activity که در آن کلاسها را ساختیم استفاده کنیم. برای این منظور یک متد می سازیم و داخل آن تست مورد نظرمان را می نویسیم. به این ترتیب تغییر زیر را در کلاس AndroidCourseActivity خواهیم داشت:

 


  1.     /** Called when the activity is first created. */
  2.     @Override
  3.     public void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.main);
  6.  
  7.         initializeUi();
  8.         testArray();
  9.     }
  10.  
  11.  
  12.  
  13.     private void testArray() {
  14.         byte[] testBytes = ArrayTest.fillArray(10);
  15.         Log.i("LOG", "Original Bytes");
  16.         ArrayTest.dumpArray(testBytes);
  17.  
  18.         byte[] testDestBytes = ArrayTest.copyBytes(testBytes);
  19.  
  20.         Log.i("LOG", "Copied Bytes");
  21.         ArrayTest.dumpArray(testDestBytes);
  22.     }

 

 

خط 14: متد fillArray را صدا می کنیم یا به عبارت دیگر می گوییم یک byte array به 10 عنصر بساز و آنرا برگردان. سپس byte array برگردانده شده را در testBytes ذخیره می کنیم.

خط 16: testBytes را چاپ می کنیم.

خط 18: testBytes را به عنوان ورودی به copyBytes می فرستیم و یک byte array دیگر از این متد دریافت و سپس آنرا چاپ می کنیم.

 

نکته مورد توجه این است که از این نوع تعریف array که با استفاده از نماد [ ] تعریف می شود می توانیم برای ساخت array از primitive ها و object ها استفاده کنیم. اما به دلیل محدودیتهایی که این نوع تعریف دارد و سختی برنامه نویسی آن، بسیاری از اوقات ترجیح داده می شود از نوع دوم تعریف array ها که در زیر توضیح داده شده استفاده کنیم.

با تعریف array از روش بالا، یک static sized array خواهیم داشت یعنی نمی توانیم تعداد عناصر آنرا پس از ساخته شدنش عوض کنیم. یعنی نمی شود به عناصر اضافه کرد یا کم کرد. فقط می شود روی عناصر آن نوشت و خواند. اما در روش دوم که در زیر تعریف می شود با dynamic sized array طرف هستیم که قابلیت بسیاری دارد اما محدودیتی هم دارد که نمی توان برای primitive ها array ساخت و حتماً باید نوع array ها از جنس class باشد. این محدودیت هم به راحتی قابل حل خواهد بود.


 

روش دوم ساخت Array با استفاده از Collection * ها:

از آنجاییکه کاربرد ArrayList بسیار کاملتر، راحتتر و سریعتر است بیشتر از آن استفاده می کنیم. ArrayList ها مانند هر زیر کلاسی از Collection ها می توانند یک array که قابل داشتن عناصر تکراری، از یک کلاس باشد. با استفاده از ArrayList متدهایی خواندن، نوشتن و پردازش ArrayList ها بسیار ساده خواهد شد.

یک ArrayList در هنگام تعریف شدن، نام یک کلاس را بصورت Generic دریافت و خود را آماده پذیرفتن عناصر آن می کند. یک ArrayList از جنس Vehicle ها بصورت زیر ساخته می شود.

» خط زیر را به عنوان یک فیلد در کلاس Vehicle تعریف کنید.


  1.     public static ArrayList mVehicles      = new ArrayList();

 

فرض کنید که Constructor کلاس Vehicle به شکل زیر باشد که در آنها به mVehicles یک نمونه اضافه می کنیم ( این تغییر را بر روی کد ندهید ):


  1.     public Vehicle() {
  2.         Vehicle.mVehicleCount++;
  3.         mVehicles.add(this);
  4.     }
  5.  
  6.  
  7.  
  8.     public Vehicle(float speed, int weight) {
  9.         Log.i("LOG", "Vehicle Created with Speed: " + speed + ", Weight: " + weight);
  10.         mSpeed = speed;
  11.         mWeight = weight;
  12.         Vehicle.mVehicleCount++;
  13.         mVehicles.add(this);
  14.     }

 

 

با این حساب با ساختن هر نوع کلاسی که از خود کلاس Vehicle یا زیر کلاس آن مانند Car یا Truck باشد با استفاده از mVehicles.add به آرایه ساخته شده، اضافه می شود. کلمه this هم طبق قسمتهای قبل که گفته شد اشاره به آن نمونه ساخته شده می کند. اما یک نکته مهم این است که، چرا می توانیم Car را به عنوان Vehicle استفاده کنیم و به آرایه ای که از جنس Vehicle نیاز دارد، یک نمونه از Car را بفرستیم. علت این است که Car یک Vehicle است، همینطور Truck یک Car است پس Truck هم یک Vehicle است. اما بر عکس آن غلط است یعنی هر Vehicle یک Car نیست و ممکن است Boat باشد. پس استفاده از یک نمونه زیر کلاس بجای نمونه ای از آن کلاس در همه جا ( نه تنها Array ها ) مجاز است. اما با اینکار مشکلاتی بوجود می آید که در بحث Casting به آن اشاره خواهیم کرد.

توابعی که به ما در کاربرد ArrayList ها کمک خواهند کرد در زیر به اختصار بیان شده اند. توجه کنید که هدف این متد صرفاً نمایش نوع عملیات است و کاربرد عملی آن غیر منطقی است، این متد در Vehicle اضافه می گردد.


  1.     public static void testVehicleArray() {
  2.         /* اضافه کردن یک نمونه به این کلاس */
  3.         Vehicle vehicle = new Vehicle(100.0f, 10);
  4.  
  5.         /* حذف همه عناصر از درون آرایه و خالی کردن آن. خود عناصر حذف نمی شوند */
  6.         mVehicles.clear();
  7.  
  8.         /* اضافه کردن نمونه ساخته شده به آرایه */
  9.         mVehicles.add(vehicle);
  10.  
  11.         /* تشخیص اینکه آیا آرایه نمونه ساخته شده را در بر دارد یا خیر */
  12.         if (mVehicles.contains(vehicle)) {
  13.  
  14.             /* حذف عنصر از آرایه، خود عنصر از بین نمی رود */
  15.             mVehicles.remove(vehicle);
  16.         }
  17.  
  18.         /* با توجه به کدهای بالا، هم اکنون آرایه باید خالی باشد */
  19.         int size = mVehicles.size(); /* گرفتن تعداد عناصر موجود در آرایه */
  20.  
  21.         /* چک کردن اینکه آیا آرایه خالی است */
  22.         if (mVehicles.isEmpty()) {
  23.             /* اضافه کردن نمونه ساخته شده به آرایه در ایندکس 0 */
  24.             mVehicles.add(vehicle);
  25.  
  26.             /* اضافه کردن نمونه ساخته شده به آرایه در ایندکس 1 */
  27.             mVehicles.add(vehicle);
  28.  
  29.             /* اضافه کردن نمونه ساخته شده به آرایه در ایندکس 2 */
  30.             mVehicles.add(vehicle);
  31.         }
  32.  
  33.         /* با اینحساب در این خط آرایه ما سه عنصر دارد از ایندکس 0 تا 2 */
  34.         /* و ما با کد زیر سومین عنصر را می گیریم و در اشاره گر دیگری قرار می دهیم */
  35.         Vehicle sampleVehicle = mVehicles.get(2);
  36.  
  37.         /* روش اول پیمودن تمام عناصر آرایه و دسترسی به مقدار وزن آنها */
  38.         for (int i = 0; i < mVehicles.size(); i++) {
  39.             Log.i("LOG", "Vehicle #" + i + ".mWeight= " + mVehicles.get(i).mWeight);
  40.         }
  41.  
  42.         /* روش دوم پیمودن تمام عناصر آرایه و دسترسی به مقدار وزن آنها */
  43.         for (Vehicle iVehicle: mVehicles) {
  44.             Log.i("LOG", "Vehicle #" + mVehicles.indexOf(iVehicle) + ".mWeight= " + iVehicle.mWeight);
  45.         }
  46.     }

 

 

برای اجرای کد می توانید متد onCreate در کلاس AndroidCourseActivity را به شکل زیر تغییر دهید:


  1.     /** Called when the activity is first created. */
  2.     @Override
  3.     public void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.main);
  6.  
  7.         initializeUi();
  8.         testArray();
  9.  
  10.         Vehicle.testVehicleArray();
  11.     }

 

 

 


چند الگوریتم معروف:

البته فعلاً دو تا نوشتم، اگر چیز دیگری یادم اومد می نویسم، با تغییر متد زیر می توان آنها را اجرا کنید:


  1.     /** Called when the activity is first created. */
  2.     @Override
  3.     public void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.main);
  6.  
  7.         initializeUi();
  8.         testArray();
  9.  
  10.         Vehicle.testVehicleArray();
  11.  
  12.         Log.i("LOG", "Divisions: ");
  13.         testAlgorithm1(15, 3);
  14.  
  15.         Log.i("LOG", "Factorial: " + testAlgorithm2(6));
  16.     }
  17.  
  18.  
  19.  
  20.     /** محاسبه اعداد بخش پذیر به یک عدد خاص در محدوده 0 تا یک عدد دیگر به عنوان ورودی */
  21.     private void testAlgorithm1(int toNumber, int devisionBy) {
  22.         for (int i = 0; i < toNumber; i++) {
  23.             /* آیا به آن عدد بخش پذیر است */
  24.             if (i % devisionBy == 0) {
  25.                 Log.i("LOG", "" + i);
  26.             }
  27.         }
  28.  
  29.         /* چاپ خود آن عدد */
  30.         Log.i("LOG", "" + toNumber);
  31.     }
  32.  
  33.  
  34.  
  35.     /** محاسبه فاکتوریل یک عدد */
  36.     private long testAlgorithm2(int number) {
  37.         if (number == 1) {
  38.             return 1;
  39.         } else {
  40.             return number * testAlgorithm2(number - 1);
  41.         }
  42.     }

 


سورس برنامه:

می توانید سورس را از آدرس زیر دانلود کنید:

http://dl1.uncocoder.com/free/source/AndroidCourse_v7.zip


توصیه ها:

- فقط تمرین توصیه می گردد. تمرین کنید تا فاصله زمانی بین فکر کردن و تایپ کردن شما بسیار کوتاه شود

 

مطالب مرتبط

آخرین شرکتهای طرف قرارداد

دارولند

طراحی فروشگاه اینترنتی

آف مکس

طراحی سایت تخفیف گروهی

نمایندگان بیمه ما

طراحی وب سایت و پورتال نمایندگان

پژند الکترونیک

طراحی وب سایت و پرتال

نمایندگی بوش

طراحی وب سایت شرکتی

ایران بزرگ

طراحی وب سایت، اتوماسیون اداری و خدمات شبکه پایگاه خبری ایران بزرگ

ستون فقرات تهران

طراحی پورتال تخصصی پزشکی ستون فقرات تهران

آخرین توییت ها

آخرین مقالات آموزشی

استفاده از تکنولوژی روز دنیا در شرکت فناوران راتا رایان