آموزش برنامه نویسی جاوا (بخش یازدهم: آموزش استفاده از Array List در جاوا)

استاندارد

در بخش های قبلی، وقتی یک آرایه را تعریف می کردیم، تعداد خانه های آن را نیز مشخص می نمودیم. ولی این سوال پیش می آید که اگر تعداد خانه های آرایه را به طور دقیق ندانیم چی کار کنیم؟

فرض کنید بخواهیم اسامی افرادی را در یک آرایه بریزیم. و یا حساب ها و تراکنش های مالی بانکی را در یک آرایه عددی وارد نماییم. اگر تعداد افراد را ندانیم باید چی کار کنیم؟ می دانیم که تعداد حساب ها و تراکنش های مالی یک بانک را هم نمی دانیم. یک راه اینست که یک آرایه با تعداد خانه های خیلی زیاد تعریف کنیم. ولی ممکن است تعداد از آن نیز فراتر رود. و یا این که تعداد خانه ها را به قدری بزرگ تعریف کنیم (در حد بی نهایت) . ولی مشکلی که به وجود می آید، اینست که فضای بسیار بزرگی را برای این آرایه هدر می دهیم!

پس چاره چیست؟ ممکن است بهتر باشد از چیزی به نام ArrayList استفاده کنید. یک ArrayList در واقع یک ساختار دینامیک داده می باشد، به این معنا که آیتم ها قابل حذف و اضافه از لیست می باشند.

یک array معمولی در جاوا یک ساختار استاتیک داده می باشد، زیرا شما اندازه ی اولیه ی array خود را دارید.

برای تنظیم یک ArrayList، ابتدا باید پوشه ای از java.util library وارد کنید:

import java.util.ArrayList;

برای تعریف آرایه، باید یک object از نوع ArrayList به برنامه معرفی کنید. در اینجا ما نام این آرایه را MyList معرفی کرده ایم.

ArrayList MyList = new ArrayList( );

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

پس هر وقت آبجکت ArrayList جدید داشته باشید، می توانید با متود add، عناصری به آن اضافه نمایید:

MyList.add("Gsm");
MyList.add("Developers");
MyList.add(".ir");
MyList.add("integer");
MyList.add(8);
MyList.add("float");
MyList.add(5.2);

همان طور که می بینید در Array List بالا، ما با استفاده از آیتم add هم رشته String را به آرایه اضافه نموده ایم و هم متغیر عددی. این متغیر عددی از نوع صحیح و اعشار می تواند باشد. برای معرفی رشته آن را داخل “” قرار دادیم.

با استفاده از دستور زیر می توانید همانند آرایه به خانه ی مشخصی از Array List اشاره نمایید.

MyList.get(5);

دستور بالا به خانه 5ام از آرایه اشاره می کند. دقت نمایید که خانه اول آرایه از 0 شماره گذاری شده است.

پس اگر از دستور بالا خروجی بگیریم، باید آیتمی که در خط 5ام از کدهایی که در بالا برای add کردن آیتم، نوشته بودیم نمایش داده شود.

System.out.print(MyList.get(1));

دستور بالا خروجی Developers را چاپ می کند.

با استفاده از Remove نیز می توانید آیتمی را از Array List حذف نمایید.

به عنوان مثال دستور زیر رشته ی ” ir. ” را از آیتم های Array List حذف می کند.

MyList.remove(2);

دقت نمایید که پس از حذف یک آیتم بقیه آیتم ها یک شیفت می خورند. یعنی الان در خانه دوم از Array List بالا مقدار رشته ی “integer” است.

روش دیگری که برای حذف به کار می رود، استفاده از مقدار دقیق آیتم برای حذف است.

مثلا دستور زیر مقدار رشته ی “float” را از داخل Array Listی که ما ساختیم، حذف می کند.

MyList.remove("float");

برای نمایش کل آرایه می توانید با دستور زیر آن را در خروجی چاپ نمایید:

System.out.print(MyList);

دستور بالا خروجی زیر را به ما نشان می دهد:

[Gsm, Developers, .ir, integer, 8, float, 5.2]

برای نمایش تعداد خانه های Array List می توانید از size استفاده نمایید:

System.out.print(MyList.size());

دستور بالا برای آیتم هایی که قبلا add کرده بودیم یعنی [Gsm, Developers, .ir, integer, 8, float, 5.2] ، که تعداد 7 عدد هستند، خروجی 7 را نیز چاپ می کند.

برای آن که بدانید در Array List شما یک آیتمی وجود دارد یا خیر می توانید از contains استفاده کنید:

if(MyList.contains(8))
        System.out.print("8 mojud bud");

برای پاک کردن کل آیتم های array list می توانید از آیتم clear استفاده نمایید:

MyList.clear();

آموزش برنامه نویسی جاوا (بخش دهم: آرایه های دو بعدی و چند بعدی)

استاندارد

آرایه هایی که تاکنون بررسی میکردیم، فقط یک بعدی بودند. مثلا اگر آرایه ای که در بخش هشتم بررسی کردیم را مشاهده کنید، می بینید که به ازای هر سطر از آن جدول، یک مقدار وجود دارد. حال فرض کنید، بتوانیم در هر سطر یک آرایه یک بعدی دیگر قرار دهیم. پس اگر یک آرایه داشته باشیم که 5 سطر داشته باشد ( 5 خانه) و در هر خانه یک آرایه یک بعدی دیگر مثلا 6 سطر (6 خانه)، در واقع به تعداد 5*6=30 خانه آرایه داریم.

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

در شکل بالا، یک آرایه داریم که دارای 3 سطر و 4 ستون است. پس به تعداد 12 خانه، می توانیم مقدار بدهیم. مشاهده می کنید که مثلا خانه اول در سطر اول، با [0][0]a مشخص شده است. یا در سطر شماره 1 و ستون شماره 2 ، مکان آن خانه از آرایه با [2][1]a مشخص شده است.

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

int[] OurArray = new int[تعداد خانه ها];

حال اگر بخواهیم یک آرایه دو بعدی را تعریف نماییم، به صورت زیر عمل می کنیم:

int[][] OurArray = new int[تعداد خانه های بعد دوم][تعداد خانه های بعد اول];

در مثال بالا مشاهده می کنید که پس از تعریف نوع متغیر، از دو عدد [] استفاده نمودیم. این دو عدد مشخص می کند که آرایه ما دو بعدی است. در قسمت بعدی نام آرایه را مشخص می کنیم. سپس بعد از تساوی در سمت راست، عملگر new و دوباره نوع متغیر، و تعداد خانه های بعد اول و سپس تعداد خانه های بعد دوم را در داخل [] معرفی می کنیم.

پس در کد زیر، یک آرایه دو بعدی که در بعد اول، 5 خانه و در بعد دوم 6 خانه وجود دارد داریم.

int[][] OurArray = new int[5][6];

به زبانی دیگر 5 سطر و 6 ستون داریم. که به طور کلی 30 عدد خانه را می توان برای آرایه OurArray متصور شد.

استفاده از آرایه های دو بعدی و بعضا چندبعدی، کار ما را بسیار آسان می کنند. مثلا فرض کنید که یک آرایه دو بعدی از نوع رشته تعریف کرده ایم. در بعد اول، اسامی افرادی که در قسمت اداری کار می کنند نوشته می شود. در بعد دوم اسامی افرادی که در قسمت مالی کار می کنند نوشته می شود و در بعد سوم اسامی افرادی که در قسمت خدمات ، و در بعد چهارم اسامی مدیران نوشته می شود. یعنی با چیزی شبیه به جدول زیر مواجه هستیم:

ستون سوم ستون دوم ستون اول
فدایی میرزایی طاهری سطر اول (اداری)
ذبیحی کریمی موسوی سطر دوم (مالی)
قلزم رجبی اصغری سطر سوم (خدماتی)
قیصری برومند فاطمی سطر چهارم (مدیران)

حال اگر بخواهیم اسامی افراد بالا را در یک آرایه دوبعدی، مقداردهی نماییم به صورت زیر عمل می کنیم:

ابتدا یک آرایه دو بعدی که در بعد اول دارای 4 خانه و در بعد دوم 3 خانه دارد ، از نوع رشته (String) معرفی می کنیم.

String[][] Edare = new String [4][3];

اگر بخواهیم اسامی را درون آرایه بالا معرفی کنیم یک شیوه به صورت زیر است:

Edare[0][0]="طاهری";
Edare[0][1]="میرزایی";
Edare[0][2]="فدایی";

Edare[1][0]="موسوی";
Edare[1][1]="کریمی";
Edare[1][2]="ذبیحی";

Edare[2][0]="اصغری";
Edare[2][1]="رجبی";
Edare[2][2]="قلزم";

Edare[3][0]="فاطمی";
Edare[3][1]="برومند";
Edare[3][2]="قیصری";

مشاهده می کنید که ابتدا خانه های سطر اول، که در بعد اول از آرایه یعنی خانه شماره 0، را مقدار دهی کردیم. سپس خانه های سطر دوم و …

شیوه دیگر مقدار دهی چیزی شبیه به شیوه مقدار دهی دومی که در بخش آرایه یک بعدی تعریف نمودیم، است.  مثلا فرض کنید بخواهیم در سطر اول اعداد 1 تا 3 و در سطر دوم اعداد 4 تا 6 را معرفی کنیم.

به صورت زیر عمل می کنیم:

int [][] Array2bodi = {{1,2,3},{4,5,6}};

دقت کنید که یک کروشه کلی در قسمت سمت راست وجود دارد که در داخل آن دو کروشه دیگر که با ویرگول، از هم جدا شده اند نیز وجود دارد. هر کدام از آن کروشه ها دارای سه مقدار هستند. پس در بعد اول از آرایه بالا، 2 خانه و در بعد دوم از آرایه بالا 3 خانه وجود دارند که با اعداد 1 تا 3 و 4 تا 6 مقداری دهی شده است.

آرایه دو بعدی و حلقه For

اگر بخواهیم آرایه بالا را در خروجی چاپ کنیم به چه صورت عمل می کنیم؟

می توان با یک حلقه For تو در تو این کار را به سادگی انجام داد. از آنجاییکه آرایه بالا دو بعدی است، پس یک حلقه For تو در تو دوتایی لازم داریم.

حلقه اول برای سطر ها (بعد اول) و حلقه دوم برای ستون ها (بعد دوم) به کار می رود. سپس در قسمتی که می خواهیم آرایه دو بعدی ما چاپ شود، در خانه اول از متغیر شمارنده ای که برای حلقه اول استفاده کردیم، استفاده می کنیم. و در خانه دوم از متغیر شمارنده ای که برای حلقه دوم استفاده کردیم، استفاده می کنیم.

int [][] Array2bodi = {{1,2,3},{4,5,6}};

	for(int i=0;i<2;i++)
		for(int j=0;j<3;j++)
			System.out.print(Array2bodi[i][j]);

نتیجه خروجی کد بالا به شرح زیر می باشد.

123456

آرایه سه بعدی و بالاتر

اگر کار با آرایه دو بعدی را به خوبی یاد گرفته باشید، می توانید آرایه سه بعدی و بالاتر را نیز به آسانی یاد بگیرید.

یک آرایه سه بعدی به صورت زیر تعریف می شود:

int [][][] Array3bodi = new int [تعداد خانه های بعد سوم][تعداد خانه های بعد دوم][تعداد خانه های بعد اول];

برای محاسبه تعداد کل خانه ها کافی است که تعداد خانه های هر بعد را در هم ضرب کنید.

مثلا آرایه سه بعدی زیر را در نظر بگیرید.

int [][][] Array3bodi = new int [5][4][3];

آرایه بالا، در واقع دارای 5*4*3 خانه یعنی 60 خانه می باشد.

اگر بخواهیم یک آرایه چهار بعدی تعریف کنیم نیز می توان یک بعد اضافی تعریف نمود.

برای مثال آرایه زیر یک آرایه چهار بعدی است که در بعد اول دارای 5 خانه، در بعد دوم 4 خانه و در بعد سوم ، 3 خانه، در بعد چهارم 6  خانه دارد.

int [][][][] Array4bodi = new int [5][4][3][6];

به همین ترتیب می توانید آرایه با ابعاد بالاتر تعریف نمایید که معمولا کاربردی ندارند. و شما در برنامه های خود به ندرت پیش می آید که بخواهید از آرایه با ابعاد بالاتر از سه بعد، استفاده کنید.

آموزش برنامه نویسی جاوا (بخش نهم: کار با آرایه ها در جاوا)

استاندارد

آرایه ها و حلقه در جاوا

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

ولی اگر مقادیر، زیاد باشند باید چی کار کنیم؟ اگر اعدادی که می خواهیم به یک آرایه اختصاص دهیم زیاد باشند، استفاده از روش های قبلی کاری سخت است.

به عنوان مثال یک برنامه ی قرعه کشی را در نظر بگیرید که باید اعداد 1 تا 30 را به موقعیت های یک array اختصاص دهد. به جای تایپ یک لیست طولانی از موقعیت ها و مقادیر array ، می توانید از یک loop استفاده کنید. در اینجا کدی را مشاهده می کنید که این کار را انجام می دهد:

public class Main {
	public static void main(String[] args) {

			int[] OurArray;
			OurArray = new int[30];
			for(int i=0;i<OurArray.length;i++){
				OurArray[i]= i+1;
				System.out.print(OurArray[i]);		
			}
	}
}

اگر دقت کنید متوجه می شوید که در شرط for ، این حلقه تا مقدار OurArray.length می چرخد. یعنی OurArray.length در واقع طول یا تعداد خانه های آرایه ما را مشخص می کند.

Length یک ویژگی از آبجکت های array می باشد که می توانید برای به دست آوردن اندازه ی array از آن استفاده کنید ( تعداد موقعیت هایی که دارد). بنابراین، زمانی که مقدار در متغیر i کمتر از اندازه ی array می باشد، این loop به چرخش متداول خود ادامه خواهد داد.

 این کد باعث می شود که تمام 30 خانه ی آرایه ما با استفاده از حلقه پر شود. و شماره های 1 تا 30 به آن داده می شود.

بدیهی است که اگر می خواستیم شماره های دیگری می توانستیم به آن بدهیم. ولی اگر شماره هایی که در یک آرایه پر می شود از الگوی خاصی پیروی نکند، مجبوریم همانند بخش قبلی آن ها را دستی پر کنیم.

مرتب سازی آرایه ها در جاوا

متودهای داخلی دیگر جاوا به شما اجازه می دهند تا array های خود را مرتب سازید. برای استفاده از متود مرتب سازی array ها، ابتدا نیاز به مراجعه به یک کتابخانه ی جاوا به نام Arrays دارید. شما این کار را با عبارت import انجام می دهید.

عبارت import زیر را اضافه کنید (بالای کلاس Main):

import java.util.Arrays;

فرض کنیم کد جاوای ما به صورت زیر باشد:

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {

			int[] OurArray;
			OurArray = new int[7];
			OurArray[0]=5;
			OurArray[1]=3;
			OurArray[2]=9;
			OurArray[3]=8;
			OurArray[4]=7;
			OurArray[5]=1;
			OurArray[6]=2;

	}
}

آرایه OurArray با اعداد بالا پر شده است که اگر طبق کد زیر خروجی Print از آن بگیریم

for(int i=0;i<OurArray.length;i++){
    System.out.print(OurArray[i]);
			}

خروجی زیر را مشاهده می کنیم:

5398712

اعداد بالا خانه های پر شده ی آرایه را به ما نشان می دهند.

کد زیر که از همان کتابخانه ای که آن را Import کرده بودیم، آمده است، آرایه ما را مرتب می کند.

Arrays.sort(OurArray);

حال اگر از آرایه خروجی بگیرید، مشاهده می کنید که آرایه ما به ترتیب زیر پر شده است:

1235789

آموزش برنامه نویسی جاوا (بخش هشتم: آرایه ها در جاوا)

استاندارد

در ابتدا به این سوال پاسخ می دهیم که یک array چیست؟

تاکنون با متغیرهایی کار کردید که فقط یک مقدار را در خود حفظ می کنند. متغیرهای صحیح که تنظیم می کردیم، فقط یک عدد را حفظ می کنند و متغیرهای رشته نیز فقط یک رشته از متن را در خود دارند.

یک array (ردیف) ، روشی برای حفظ بیشتر از یک مقدار در یک زمان می باشد که در واقع شبیه لیستی از آیتم ها می باشد. یک array را می توان به عنوان ستون هایی در یک صفحه ی گسترده در نظر گرفت. در واقع آرایه یک سری خانه را که پشت سر هم قرار گرفته اند مشخص می کند. به آن ها فضا می دهد. این فضا بر اساس نوع متغیر آرایه شما است.

مثلا اگر یک آرایه از نوع int با 4 خانه مشخص کنید، ارایه 4 خانه به اندازه فضای int ، مشخص می کند. و پشت سر هم قرار می دهد. حال می توانید در این خانه ها مقدار هایی که می خواهید را بدهید.

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

 

array value row
8 0
4 1
6 2
5 3
2 4

همان طور که در جدول بالا مشاهده می کند، آرایه برای هر ردیف، یک مقدار عددی دارد. هر ردیف با یک شماره عددی مشخص می شود که مقدار آن در ستون رو به روی آن نوشته شده است. در جدول بالا، مشاهده می کنید که ردیف ها از شماره 0 شروع شده و تا شماره 4 ادامه دارد.

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

مثال:

int[] OurArray;

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

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

OurArray = new int[5];

شما با نام array شروع کرده اید که با علامت تساوی دنبال می شود. پس از علامت تساوی به لغت کلیدی new و سپس مجددا نوع داده ی خود، نیاز دارید. پس از نوع داده یک جفت کروشه قرار می گیرد. بین کروشه ها نیاز به اندازه ی array دارید. اندازه در واقع تعداد موقعیت هایی است که array باید حفظ کند.

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

int[] OurArray = new int[5];

عدد 5 معرف تعداد خانه های آرایه است. یعنی ما 5 خانه داریم که از شماره 0 تا 4 هستند. دقت نمایید که شماره 5 قابل استفاده نیست.

بنابراین ما به جاوا اعلام می کنیم که یک array را با 5 موقعیت در آن تنظیم کند. پس از اجرای این خط، جاوا مقادیر پیش فرض را برای array اختصاص خواهد داد.

از آنجایی که ما یک array مقدار صحیح تنظیم کرده ایم، مقادیر پیش فرض برای همه ی 5 موقعیت 0 خواهد بود.

حال سوالی که پیش می آید اینست که ستون دوم در جدول بالا که مربوط به مقادیر هر سطر آرایه است را چگونه معرفی کنیم؟

کد زیر باعث می شود که به سطر اول از آرایه OurArray مقدار 8 را بدهیم. همان گونه که برای یک متغیر تکی int قبلا مقدار دهی میکردیم، در اینجا نیز به همین ترتیب پیش می رویم. تنها تفاوت اینست که شماره آن سطر یا خانه ای که می خواهیم به آن مقدار بدهیم، را باید مشخص کنیم.

OurArray[0]=8;

برای مقدار دادن به بقیه سطرها یا خانه های آرایه نیز به همین ترتیب عمل می کنیم:

OurArray[1]=4;
OurArray[2]=6;
OurArray[3]=5;
OurArray[4]=2;

روش دیگر مقدار دهی به آرایه به صورت زیر است:

int OurArray2[]={5,4,8,6};

این نوع تعریف به صورت اتوماتیک خودش تعداد خانه های آرایه را تعیین می کند. که در مثال بالا همانند اینست در واقع [3]OurArray2 است. یعنی 4 خانه که از شماره 0 تا سه هستند.

این متود در حال تنظیم یک array با استفاده از کروشه ها بعد از علامت تساوی، می باشد. در بین کروشه ها مقادیری را تایپ می کنید که array خواهد گرفت. اولین مقدار در موقعیت 0 و دومین مقدار در موقعیت 1 و غیره خواهد بود. توجه داشته باشید که هنوز پس از int نیاز به کروشه دارید، اما نیازی به لغت کلیدی new یا تکرار نوع داده و یا کروشه ها ندارید.

می توانید یک آرایه از انواع متغیرهای دیگر نیز تعریف نمایید. مثلا برای متغیر String می توان آرایه ای شبیه به زیر را تعریف نمود و سپس مقدار دهی کرد:

String month[]={"mehr","aban","azar","dey","bahman","esfand"};

با استفاده از تعریف بالا یک آرایه با تعداد 6 خانه که از شماره 0 تا 5 هستند، معرفی شده و سپس مقدار دهی می شود.

برای گرفتن خروجی از آرایه به سادگی میتوانید با مشخص کردن خانه آن آرایه، از آن خروجی بگیرید.

System.out.print(month[4]);

کد بالا خروجی “bahman” را چاپ می کند، زیرا به خانه شماره 4 آرایه اشاره می کند.