می شود . می توان آرایه ها را برای هر یک از انواع ایجاد نمود و ممکن است این
آرایه ها دارای یک یا چندین بعد باشند . برای دسترسی به یک عضو آرایه از نمایه
(index) آن آرایه استفاده می شود . آرایه ها یک وسیله مناسب برای گروه بندی
اطلاعات مرتبط با هم هستند .
نکته : اگر با Cو C++و آشنایی دارید ، آگاه باشید . آرایه ها در جاوا بطور
متفاوتی نسبت به زبانهای دیگر کار می کنند .
آرایه های یک بعدی
آرایه یک بعدی بطور ضروری فهرستی از متغیرهای یکنوع است . برای ایجاد یک
آرایه ، باید یک متغیر آرایه از نوع مورد نظرتان ایجاد کنید . فرم عمومی اعلان
یک آرایه یک بعدی بقرار زیر است :
type var-name [];
نام متغیر نوع
در اینجا type اعلان کننده نوع اصلی آرایه است . نوع اصلی تعیین کننده نوع
داده برای هر یک از اعضائ داخل در آرایه است . بنابراین ، نوع اصلی آرایه تعیین
می کند که آرایه چه نوعی از داده را نگهداری می کند . بعنوان مثال ، در زیر
یک آرایه با نام month-days با نوع آرایه ای از عدد صحیح اعلان شده است .
+ int month_days[];
اگر چه این اعلان تثبیت می کند که month-days یک متغیر آرایه است ، اما بطور
واقعی آرایه ای وجود ندارد . در حقیقت ، مقدار month-days برابر تهی (null)
می باشد که یک آرایه بدون مقدار را معرفی می کند . برای پیوند دادن month-days
با یک آرایه واقعی و فیزیکی از اعداد صحیح ، باید از یک عملگر new استفاده
نموده و به month-days منتسب کنید. new یک عملگراست که حافظه را اختصاص میدهد.
بعداnew ” را با دقت بیشتری بررسی می کنیم ، اما لازم است که هم اکنون از آن
استفاده نموده و حافظه را برای آرایه ها تخصیص دهید . فرم عمومی new آنگونه که
برای آرایه های یک بعدی بکار می رود بقرار زیر ظاهر خواهد شد :
array-var=new type [size];
اندازه نوع متغیر آرایه
در اینجا type مشخص کننده نوع داده ای است که تخصیص داده می شود، size مشخص
کننده تعداد اعضائ آرایه است و array-var متغیر آرایه است که به آرایه پیوند
می یابد . یعنی برای استفاده از new در تخصیص یک آرایه ، باید نوع و تعداد
اعضایی که تخصیص می یابند را مشخص نمایید . اعضائ آرایه که توسط new تخصیص
می یابند بطور خودکار با مقدار صفر مقدار دهی اولیه می شوند . این مثال یک
آرایه ۱۲ عضوی از اعداد صحیح را تخصیص داده و آنها را به month-days پیوند
می دهد .
+ month_days = new int[12];
بعد از اجرای این دستور ، month-days به یک آرایه ۱۲ تایی از اعداد صحیح
ارجاع خواهد نمود . بعلاوه کلیه اجزائ در آرایه با عدد صفر مقدار دهی اولیه
خواهند شد .
اجازه دهید مرور کنیم : بدست آوردن یک آرایه مستلزم پردازش دو مرحله ای است .
اول باید یک متغیر با نوع آرایه مورد نظرتان اعلان کنید . دوم باید حافظه ای که
آرایه را نگهداری می کند ، با استفاده از new تخصیص دهید و آن را به متغیر
آرایه نسبت دهید . بنابراین در جاوا کلیه آرایه ها بطور پویا تخصیص می یابند .
اگر مفهوم تخصیص پویا برای شما ناآشناست نگران نباشید . این مفهوم را بعدا”
تشریح خواهیم کرد .
هر بار که یک آرایه را تخصیص می دهید ، می توانید بوسیله مشخص نمودن نمایه
آن داخل کروشه [] به یک عضو مشخص در آرایه دسترسی پیدا کنید . کلیه نمایه های
آرایه ها با عدد صفر شروع می شوند. بعنوان مثال این دستور مقدار ۲۸ را به دومین
عضو month-days نسبت می دهد .
+ month_days[1] = 28;
خط بعدی مقدار ذخیره شده در نمایه ۳ را نمایش می دهد .
+ System.out.println(month_days[3]);
با کنار هم قرار دادن کلیه قطعات ، در اینجا برنامه ای خواهیم داشت که یک
آرایه برای تعداد روزهای هر ماه ایجاد می کند .
+ // Demonstrate a one-dimensional array.
+ class Array {
+ public static void main(String args[] ){
+ int month_days[];
+ month_days = new int[12];
+ month_days [0] = 31;
+ month_days [1] = 28;
+ month_days [2] = 31;
+ month_days [3] = 30;
+ month_days [4] = 31;
+ month_days [5] = 30;
+ month_days [6] = 31;
+ month_days [7] = 31;
+ month_days [8] = 30;
+ month_days [9] = 31;
+ month_days [10] = 30;
+ month_days [11] = 31;
+ System.out.println(“April has ” + month_days[3] + ” days .”);
+ }
+ }
وقتی این برنامه را اجرا میکنید ، برنامه ، تعداد روزهای ماه آوریل را چاپ
میکند. همانطوریکه ذکر شد، نمایه های آرایه جاوا با صفر شروع می شوند، بنابراین
تعداد روزهای ماه آوریل در month-days[3] برابر ۳۰ می باشد .
این امکان وجود دارد که اعلان متغیر آرایه را با تخصیص خود آرایه بصورت زیر
ترکیب نمود : + int month_days[] = new int[12];
این همان روشی است که معمولا” در برنامه های حرفه ای نوشته شده با جاوا مشاهده
می کنید .
می توان آرایه ها را زمان اعلانشان ، مقدار دهی اولیه نمود . پردازش آن بسیار
مشابه پردازشی است که برای مقدار دهی اولیه انواع ساده استفاده می شود . یک
مقدار ده اولیه آرایه فهرستی از عبارات جدا شده بوسیله کاما و محصور شده بین
ابروهای باز و بسته می باشد . کاماها مقادیر اجزائ آرایه را از یکدیگر جدا
می کنند . آرایه بطور خودکار آنقدر بزرگ ایجاد می شود تا بتواند ارقام اجزایی
را که در مقدار ده اولیه آرایه مشخص کرده اید ، دربرگیرد . نیازی به استفاده از new
وجود ندارد . بعنوان مثال ، برای ذخیره نمودن تعداد روزهای هر ماه ، کد
بعدی یک آرایه مقدار دهی اولیه شده از اعداد صحیح را بوجود می آورد :
+ // An improved version of the previous program.
+ class AutoArray {
+ public static void main(String args[] ){
+ int month_days[] = { 31/ 28/ 31/ 30/ 31/ 30/ 31/ 31/ 30/ 31/ 30/ 31 };
+ System.out.println(“April has ” + month_days[3] + ” days .”);
+ }
+ }
وقتی این برنامه را اجرا کنید ، همان خروجی برنامه قبلی را خواهید دید .
جاوا بشدت کنترل می کند تا مطمئن شود که بطور تصادفی تلاشی برای ذخیره نمودن
یا ارجاع مقادیری خارج از دامنه آرایه انجام ندهید . سیستم حین اجرای جاوا
کنترل می کند که کلیه نمایه های آرایه ها در دامنه صحیح قرار داشته باشند . ( از
این نظر جاوا کاملا”با Cاو C++و متفاوت است که هیچ کنترل محدوده ای در حین اجرا
انجام نمی دهند . ) بعنوان مثال ، سیستم حین اجرا ، مقدار هر یک از نمایه ها به month-days
را کنترل می کند تا مطمئن شود که بین ارقام ۰ و ۱۱ داخل قرار داشته
باشند . اگر تلاش کنید تا به اجزائ خارج از دامنه آرایه ( اعداد منفی یا اعدادی
بزرگتر از طول آرایه ) دسترسی یابید، یک خطای حین اجرا (run-time error) تولید
خواهد شد .
در زیر یک مثال پیچیده تر مشاهده می کنید که از یک آرایه یک بعدی استفاده
می کند . این برنامه میانگین یک مجموعه از ارقام را بدست می آورد .
+ // Average an array of values.
+ class Average {
+ public static void main(String args[] ){
+ double nums[] = {10.1/ 11.2/ 12.3/ 13.4/ 14.5};
+ double result = 0;
+ int i;
+
+ for(i=0; i<5; i++)
+ result = result + nums[i];
+
+ System.out.println(“Average is ” + result / 5);
+ }
+ }
آرایه های چند بعدی
در جاوا آرایه های چند بعدی در واقع آرایه ای از آرایه ها هستند . این قضیه
همانطوریکه انتظار دارید ظاهر و عملکردی مشابه آرایه های چندبعدی منظم (regular)
دارد . اما خواهید دید که تاوتهای ظریفی هم وجود دارند . برای اعلان یک متغیر
آرایه چند بعدی ، با استفاده از مجموعه دیگری از کروشه ها هر یک از نمایه های
اضافی را مشخص می کنید. بعنوان مثال ، عبارت زیرر یک متغیر آرایه دو بعدی بنام twoD
را اعلان می کند .
+ int twoD[][] = new int[4][5];
این عبارت یک آرایه ۴در ۵ر را تخصیص داده و آن را به twoD نسبت می دهد . از
نظر داخلی این ماتریس بعنوان یک آرایه از آرایه نوع int پیاده سازی خواهد شد .
بطور فرضی ، این آرایه را می توان بصورت شکل زیر نمایش داد .
Right index determines column.
|| || || || ||
\/ \/ \/ \/ \/
|
| [0][4] | [0][3] | [0][2] | [0][1] | [0][0] >
|
| |
| [1][4] | [1][3] | [1][2] | [1][1] | [1][0] >
Left index
determines |
| [2][4] | [2][3] | [2][2] | [2][1] | [2][0] .> row
|
| |
| [3][4] | [3][3] | [3][2] | [3][1] | [3][0] >
Given :int twoD[][] = new int [4][5];
برنامه بعدی هر عضو آرایه را از چپ به راست ، و از بالا به پایین شماره داده
و سپس مقادیر آنها را نمایش می دهد :
+ // Demonstrate a two-dimensional array.
+ class TwoDArray {
+ public static void main(String args[] ){
+ int twoD[][] = new int[4][5];
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j<5; j++ ){
+ twoD[i][j] = k;
+ k++;
+
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j<5; j++)
+ System.out.print(twoD[i][j] + ” “);
+ System.out.println)(;
+ }
+ }
+ }
خروجی این برنامه بقرار زیر خواهد بود : ۰ ۱ ۲ ۳ ۴
۵ ۶ ۷ ۸ ۹
۱۰ ۱۱ ۱۲ ۱۳ ۱۴
۱۵ ۱۶ ۱۷ ۱۸ ۱۹
هنگام تخصیص حافظه به یک آرایه چند بعدی ، کافی است فقط حافظه برای اولین
بعد را مشخص نمایید . می توانید ابعاد دیگر را جداگانه تخصیص دهید . بعنوان
مثال ، کد زیر حافظه اولین بعد twoD را هنگام اعلان آن تخصیص می دهد . این کد
حافظه دومین بعد را بصورت دستی اختصاص می دهد .
+ int twoD[][] = new int[4][];
+ twoD[0] = new int[5];
+ twoD[1] = new int[5];
+ twoD[2] = new int[5];
+ twoD[3] = new int[5];
اگرچه در این حالت اختصاص انفرادی حافظه به دومین بعد هیچ مزیتی ندارد، اما
احتمال چنین مزیتهایی وجود دارد . بعنوان مثال ، هنگامیکه ابعاد را بصورت دستی
اختصاص می دهید ، نیازی نیست که همان ارقام برای اجزائ هر بعد را تخصیص دهید .
همانطوریکه قبلا” گفتیم ، از آنجاییکه آرایه های چند بعدی واقعا” آرایه ای از
آرایه ها هستند ، طول هر یک از آرایه ها تحت کنترل شما قرار می گیرند . بعنوان
مثال ، برنامه بعدی یک آرایه دو بعدی ایجاد می کند که در آن اندازه های دومین
بعد نامساوی هستند .
+ // Manually allocate differing size second dimension.
+ class TwoDAgain {
+ public static void main(String args[] ){
+
+
+ int twoD[][] = new int[4][];
+ twoD[0] = new int[1];
+ twoD[1] = new int[2];
+ twoD[2] = new int[3];
+ twoD[3] = new int[4];
+
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j
+ towD[i][j] = k;
+ k++;
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j
+ System.out.print(twoD[i][j] + ” “);
+ System.out.println)(;
+ }
+ }
+ }
خروجی این برنامه بقرار زیر می باشد : ۰
۱ ۲
۳ ۴ ۵
۶ ۷ ۸ ۹
آرایه ای که توسط این برنامه ایجاد می شود ، بصورت زیر خواهد بود :
| [۰][۰] |
| [۱][۰] | [۱][۱] |
| [۲][۰] | [۲][۱] | [۲][۲] |
| [۳][۰] | [۳][۱] | [۳][۲] | [۳][۳] |
از آرایه های چند بعدی ناجور ( یا نامنظم ) در اکثر برنامه ها استفاده نمیشود
زیرا برخلاف آنچه مردم هنگام مواجه شدن با یک آرایه چند بعدی انتظار دارند
رفتار می کنند . اما این آرایه ها در برخی شرایط بسیار کارا هستند . بعنوان
مثال ، اگر نیاز به یک آرایه دو بعدی خیلی بزرگ دارید که دارای تجمع پراکنده
باشد ( یعنی که یکی و نه همه اجزائ آن مورد استفاده قرار می گیرند ) ، آنگاه
آرایه بی قاعده احتمالا” یک راه حل کامل خواهد بود .
این امکان وجود دارد که آرایه های چند بعدی را مقدار دهی اولیه نمود . برای
اینکار ، فقط کافی است هر یک از مقدار ده اولیه ابعاد را داخل مجموعه ابروهای
ختص خودش قرار دهید . برنامه بعدی یک ماتریس ایجاد می کند که هر یک از اجزائ
آن شامل حاصلضرب نمایه های سطرها و ستونها هستند. همچنین دقت نمایید که می توان
از عبارات همچون مقادیر لفظی داخل مقدار ده اولیه آرایه استفاده نمود .
+ // Initialize a two-dimensional array.
+ class Matrix {
+ public static void main(String args[] ){
+ double m[][] = {
+ { 0*0/ 1*0/ 2*0/ 3*0 };
+ { 0*1/ 1*1/ 2*1/ 3*1 };
+ { 0*2/ 1*2/ 2*2/ 3*2 };
+ { 0*3/ 1*3/ 2*3/ 3*3 };
+ };
+ int i/ j;
+
+ for(i=0; i<4; i++ ){
+ for(j=0 j<4; j++)
+ System.out.print(m[i][j] + ” “);
+ System.out.println)(;
+ }
+ }
+ }
پس از اجرای این برنامه ، خروجی آن بقرار زیر خواهد بود : ۰ ۰ ۰ ۰
۰ ۱ ۲ ۳
۰ ۲ ۴ ۶
۰ ۳ ۶ ۹
همانطوریکه مشاهده می کنید، هر سطر در آرایه همانگونه که در فهرستهای مقدار
دهی اولیه مشخص شده ، مقدار دهی اولیه شده است .
مثالهای بیشتری درباره استفاده از آرایه چند بعدی بررسی می کنیم . برنامه
بعدی یک آرایه سه بعدی ۳x4x5 ایجاد می کند . سپس حاصل نمایه های مربوطه را برای
هر عضو بارگذاری می کند . در نهایت این حاصل ها را نمایش خواهد داد :
+ // Demonstrate a three-dimensional array.
+ class threeDDatrix {
+ public static void main(String args[] ){
+ int threeD[][][] = new int[3][4][5];
+ int i/ j/ k;
+ for(i=0; i<3; i++)
+ for(j=0; j<4; j++)
+ for(k=0; k<5; k++)
+ threeD[i][j][k] = i * j * k;
+
+ for(i=0; i<3; i++ ){
+ for(j=0; j<4; j++ ){
+ for(k=0; k<5; k++)
+ System.out.print(threeD[i][j][k] + ” “);
+ System.out.println)(;
+ }
+ System.out.println)(;
+ }
+ }
+ }
خروجی این برنامه بقرار زیر خواهد بود : ۰ ۰ ۰ ۰ ۰
۰ ۰ ۰ ۰ ۰
۰ ۰ ۰ ۰ ۰
۰ ۰ ۰ ۰ ۰
۰ ۰ ۰ ۰ ۰
۰ ۱ ۲ ۳ ۴
۰ ۲ ۴ ۶ ۸
۰ ۳ ۶ ۹ ۱۲
۰ ۰ ۰ ۰ ۰
۰ ۲ ۴ ۶ ۸
۰ ۴ ۸ ۱۲ ۱۶
۰ ۶ ۱۲ ۱۸ ۲۴
دستور زبان جایگزین اعلان آرایه
یک شکل دوم برای اعلان یک آرایه بصورت زیر وجود دارد :
type [] var-name;
نام متغیر نوع
در اینجا کروشه ها بعداز مشخص کننده نوع می آیند نه بعداز نام متغیر آرایه .
بعنوان مثال دو شکل اعلان زیر یکسان عمل می کنند :
+ int a1[] = new int[3];
+ int[] a2 = new int[3];
دو شکل اعلان زیر هم یکسان عمل می کنند :
+ char twod1[][] = n
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن