آرايه
ها در جاوا
يك
آرايه گروهي از متغيرهاي يك نوع است كه با يك نام مشترك به آنها ارجاع مي شود . مي
توان آرايه ها را براي هر يك از انواع ايجاد نمود و ممكن است اين آرايه ها داراي
يك يا چندين بعد باشند . براي دسترسي به يك عضو آرايه از نمايه (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 45 6 7
8 910 11 12 13 1415 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)(;
+ }
+ }
+ }
خروجي
اين برنامه بقرار زير مي باشد : 01 23 4 56 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 00 1 2 30 2 4 60 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 00 0 0 0
00 0 0 0 00 0 0 0 00 0 0
0 00 1 2 3 40 2 4 6 80 3 6 9 12 0 0
0 0 00 2 4 6 80 4 8 12 160
6 12 18 24
دستور
زبان جايگزين اعلان آرايه يك شكل دوم براي اعلان يك آرايه بصورت زير وجود دارد :
type []
var-name;
نام
متغير نوع در اينجا كروشه ها بعداز مشخص كننده نوع مي آيند نه بعداز نام متغير
آرايه . بعنوان مثال دو شكل اعلان زير يكسان عمل مي كنند :
+ int a1[] = new int[3];
+ int[] a2 = new int[3];
دو
شكل اعلان زير هم يكسان عمل مي كنند :
+ char twod1[][]
= n
بازگشت به فهرست
بازگشت به صفحه نخست