ادامه ی آشنایی با جاوا ...

آرایه ها در جاوا

یک آرایه گروهی از متغیرهای یک نوع است که با یک نام مشترک به آنها ارجاع می شود . می توان آرایه ها را برای هر یک از انواع ایجاد نمود و ممکن است این آرایه ها دارای یک یا چندین بعد باشند . برای دسترسی به یک عضو آرایه از نمایه (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 تخصیص می یابند بطور خودکار با مقدار صفر مقدار دهی اولیه می شوند . این مثال یک آرایه 12 عضوی از اعداد صحیح را تخصیص داده و آنها را به month-days پیوند می دهد .

+ month_days = new int[12];

بعد از اجرای این دستور ، month-days به یک آرایه 12 تایی از اعداد صحیح ارجاع خواهد نمود . بعلاوه کلیه اجزائ در آرایه با عدد صفر مقدار دهی اولیه خواهند شد . اجازه دهید مرور کنیم : بدست آوردن یک آرایه مستلزم پردازش دو مرحله ای است . اول باید یک متغیر با نوع آرایه مورد نظرتان اعلان کنید . دوم باید حافظه ای که آرایه را نگهداری می کند ، با استفاده از new تخصیص دهید و آن را به متغیر آرایه نسبت دهید . بنابراین در جاوا کلیه آرایه ها بطور پویا تخصیص می یابند . اگر مفهوم تخصیص پویا برای شما ناآشناست نگران نباشید . این مفهوم را بعدا" تشریح خواهیم کرد . هر بار که یک آرایه را تخصیص می دهید ، می توانید بوسیله مشخص نمودن نمایه آن داخل کروشه [] به یک عضو مشخص در آرایه دسترسی پیدا کنید . کلیه نمایه های آرایه ها با عدد صفر شروع می شوند. بعنوان مثال این دستور مقدار 28 را به دومین عضو month-days نسبت می دهد .

+ month_days[1] = 28;

خط بعدی مقدار ذخیره شده در نمایه 3 را نمایش می دهد .

+ 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] برابر 30 می باشد .
این امکان وجود دارد که اعلان متغیر آرایه را با تخصیص خود آرایه بصورت زیر ترکیب نمود :

 + 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را کنترل می کند تا مطمئن شود که بین ارقام 0 و 11 داخل قرار داشته باشند . اگر تلاش کنید تا به اجزائ خارج از دامنه آرایه ( اعداد منفی یا اعدادی بزرگتر از طول آرایه ) دسترسی یابید، یک خطای حین اجرا (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];

این عبارت یک آرایه 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)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر خواهد بود

 : 0 1 2 3 4

5 6 7 8 9
10 11 12 13 14
15 16 17 18 19

هنگام تخصیص حافظه به یک آرایه چند بعدی ، کافی است فقط حافظه برای اولین بعد را مشخص نمایید . می توانید ابعاد دیگر را جداگانه تخصیص دهید . بعنوان مثال ، کد زیر حافظه اولین بعد 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)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر می باشد

 : 0

1 2
3 4 5
6 7 8 9

آرایه ای که توسط این برنامه ایجاد می شود ، بصورت زیر خواهد بود :

| [0][0] |

| [1][0] | [1][1] |

| [2][0] | [2][1] | [2][2] |

| [3][0] | [3][1] | [3][2] | [3][3] |

از آرایه های چند بعدی ناجور ( یا نامنظم ) در اکثر برنامه ها استفاده نمیشود زیرا برخلاف آنچه مردم هنگام مواجه شدن با یک آرایه چند بعدی انتظار دارند رفتار می کنند . اما این آرایه ها در برخی شرایط بسیار کارا هستند . بعنوان مثال ، اگر نیاز به یک آرایه دو بعدی خیلی بزرگ دارید که دارای تجمع پراکنده باشد ( یعنی که یکی و نه همه اجزائ آن مورد استفاده قرار می گیرند ) ، آنگاه آرایه بی قاعده احتمالا" یک راه حل کامل خواهد بود . این امکان وجود دارد که آرایه های چند بعدی را مقدار دهی اولیه نمود . برای اینکار ، فقط کافی است هر یک از مقدار ده اولیه ابعاد را داخل مجموعه ابروهای ختص خودش قرار دهید . برنامه بعدی یک ماتریس ایجاد می کند که هر یک از اجزائ آن شامل حاصلضرب نمایه های سطرها و ستونها هستند. همچنین دقت نمایید که می توان از عبارات همچون مقادیر لفظی داخل مقدار ده اولیه آرایه استفاده نمود .

+ // 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)(;
+ }
+ }
+ }

پس از اجرای این برنامه ، خروجی آن بقرار زیر خواهد بود

 : 0 0 0 0

0 1 2 3
0 2 4 6
0 3 6 9

همانطوریکه مشاهده می کنید، هر سطر در آرایه همانگونه که در فهرستهای مقدار دهی اولیه مشخص شده ، مقدار دهی اولیه شده است . مثالهای بیشتری درباره استفاده از آرایه چند بعدی بررسی می کنیم . برنامه بعدی یک آرایه سه بعدی 3x4x5 ایجاد می کند . سپس حاصل نمایه های مربوطه را برای هر عضو بارگذاری می کند . در نهایت این حاصل ها را نمایش خواهد داد :

+ // 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)(;
+ }
+ }
+ }

خروجی این برنامه بقرار زیر خواهد بود

 : 0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12

0 0 0 0 0
0 2 4 6 8
0 4 8 12 16
0 6 12 18 24

دستور زبان جایگزین اعلان آرایه

 

یک شکل دوم برای اعلان یک آرایه بصورت زیر وجود دارد :

type [] var-name;

نام متغیر نوع
در اینجا کروشه ها بعداز مشخص کننده نوع می آیند نه بعداز نام متغیر آرایه .
بعنوان مثال دو شکل اعلان زیر یکسان عمل می کنند :

+ int a1[] = new int[3];
+ int[] a2 = new int[3];

دو شکل اعلان زیر هم یکسان عمل می کنند :

+ char twod1[][] = n