نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • خطاها
  • کتابخانه برای کار با آرایه های جاوا. آرایه های چند بعدی و نامتقارن

کتابخانه برای کار با آرایه های جاوا. آرایه های چند بعدی و نامتقارن

  • جاوا،
  • الگوریتم ها
    • آموزش

    من فکر می کنم که تعداد کمی از کسانی که برای اولین مصاحبه خود آماده می شوند، هنگام درخواست برای اولین شغل خود به عنوان یک برنامه نویس (پیش) جوان، به این سوال پاسخ منفی می دهند. یا حداقل در پاسخ مثبت شک کنید. البته، چنین ساختار داده ساده با دسترسی مستقیم به فهرست - بدون ترفند! خیر، در برخی از زبان‌ها مانند جاوا اسکریپت یا PHP، آرایه‌ها البته به روشی بسیار جالب پیاده‌سازی می‌شوند و اساساً بسیار بیشتر از یک آرایه هستند. اما این چیزی نیست که ما در مورد آن صحبت می کنیم، بلکه در مورد اجرای "سنتی" آرایه ها در قالب یک "منطقه جامد حافظه" است. در این حالت بر اساس شاخص ها و اندازه یک عنصر، آدرس به سادگی محاسبه شده و به مقدار مربوطه دسترسی پیدا می شود. چه چیزی در آن سخت است؟
    بیایید آن را بفهمیم. مثلا در جاوا. درخواست از یک متقاضی ناآگاه برای ایجاد آرایه ای از اعداد صحیح nایکس n. شخص با اطمینان چیزی مانند این را می نویسد:
    int g = int[n][n] جدید;
    عالی. اکنون از شما می خواهیم که عناصر آرایه را با چیزی مقداردهی اولیه کنید. حداقل در واحدها، حداقل به صورت مجموع شاخص ها. ما گرفتیم:
    برای (int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    حتی بیشتر می نویسند
    برای (int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    که این هم دلیلی برای گفت و گو است، اما اکنون ما در مورد چیز دیگری صحبت می کنیم. ما سعی می کنیم بفهمیم که یک فرد چه می داند و ببینیم چگونه فکر می کند. بنابراین، توجه او را به این واقعیت جلب می کنیم که مقادیر به صورت متقارن قرار گرفته اند و از او می خواهیم در تکرارهای حلقه صرفه جویی کند. البته، چرا در حالی که فقط می توانید از مثلث پایین عبور کنید، از تمام مقادیر شاخص عبور کنید؟ سوژه معمولاً به راحتی موافقت می کند و عاقلانه مورب اصلی را برجسته می کند، با دقت چیزی مانند:
    برای (int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    به جای g[i][i] = 2* i; اغلب نوشته می شود g[i][i] = i + i; یا g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: برنامه چقدر سریعتر اجرا می شود؟. استدلال معمول به شرح زیر است: تقریباً 2 برابر محاسبات شاخص کمتر. تقریباً 2 برابر کمتر محاسبات مقادیر (جمع بندی)؛ همان تعداد تکالیف این به معنای 30 درصد سریعتر است.اگر فردی پیشینه ریاضی خوبی داشته باشد، حتی می توانید تعداد دقیق عملیات ذخیره شده و ارزیابی منطقی تری از اثربخشی بهینه سازی را مشاهده کنید.
    اکنون زمان ضربه اصلی است. ما هر دو نسخه کد را روی مقداری به اندازه کافی بزرگ اجرا می کنیم n(حدود چند هزار) مثلاً به این صورت.

    کد کنترل شده با زمان

    کلاس A ( public static void main (string args) (int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0; من< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    ما چه می بینیم؟ نسخه بهینه شده 10-100 برابر کندتر کار می کند! اکنون زمان مشاهده واکنش نامزد نسبت به این سمت است. واکنش به یک موقعیت استرس زا غیرمعمول (به طور دقیق تر، معمول در تمرین توسعه دهنده) چه خواهد بود. اگر چهره متهم هیجان زده شد و او شروع به فشار دادن دکمه ها کرد و به طور موقت وجود شما را فراموش کرد، این نشانه خوبی است. تا حدودی. شما نمی خواهید محققی را استخدام کنید که به نتیجه پروژه اهمیتی نمی دهد، درست است؟ سپس از او سوال "چرا؟" را نپرسید. از آنها بخواهید گزینه دوم را دوباره کار کنند تا در واقع سریعتر از اولی کار کند.
    اکنون می توانید مدتی با خیال راحت به تجارت خود بپردازید. در نیم ساعت شما مطالب کافی برای ارزیابی ویژگی های اولیه شخصی و حرفه ای متقاضی خواهید داشت.
    به هر حال، زمانی که من به طور خلاصه این مشکل را در وب سایت کاری خود توضیح دادم، محبوب ترین نظر این بود "این منحنی جاوا شماست." من کد را در عالی و رایگان مخصوصاً برای آنها ارسال می کنم. و صاحبان خوشحال Free Pascal برای ویندوز می توانند نگاهی بیندازند

    زیر اسپویلر

    زمان برنامه؛ استفاده از ویندوز؛ var start, finish, res: int64; n, i, j: عدد صحیح; g: آرایه آرایه عدد صحیح. شروع n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(شروع)؛ برای i:=1 تا n-1 برای j:=1 تا n-1 انجام دهید g := i + j; QueryPerformanceCounter(پایان)؛ writeln("زمان بر اساس ردیف:"، (پایان - شروع) / res، "sec"); QueryPerformanceCounter(شروع)؛ برای i:=1 تا n-1 برای j:=1 تا n-1 انجام دهید g := i + j; QueryPerformanceCounter(پایان)؛ writeln("زمان بر اساس cols:"، (پایان - شروع) / res، "sec"); پایان.


    در کد بالا در پاسکال، جنبه های "گیج کننده" را حذف کردم و فقط اصل مشکل را رها کردم. در صورتی که می توان این را یک مشکل نامید.
    در نهایت چه سوالاتی از متهم می پرسیم؟
    1. چرا کندتر کار می کند؟ و در جزئیات بیشتر ...
    2. چگونه می توان مقداردهی اولیه را سریعتر کرد؟

    اگر نیاز به کاوش بیشتر در پیاده سازی جاوا وجود دارد، از متقاضی می خواهیم که زمان اجرا را برای مقادیر کوچک رعایت کند. n. به عنوان مثال، در ideone.com برای n=117، گزینه "بهینه سازی" به نصف کاهش می یابد. اما برای مقدار بعدی n=118 معلوم می شود که در حال حاضر 100 (صد) برابر سریعتر از مقدار غیربهینه شده است! پیشنهاد آزمایش روی یک ماشین محلی. بگذارید با تنظیمات بازی کند.
    در ضمن، آیا همه می فهمند که چه خبر است؟

    چند کلمه توجیهی

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

    تا کنون نسخه پیشرو این است که حافظه نهان پردازنده مقصر است. آن ها دسترسی متوالی در گزینه اول در یک هش کار می کند، که هنگام حرکت فراتر از یک مرز مشخص به روز می شود. هنگام دسترسی از طریق ستون ها، هش مجبور است به طور مداوم به روز شود و این زمان زیادی می برد. بیایید این نسخه را در خالص ترین شکل آن بررسی کنیم. بیایید یک آرایه بسازیم و سریعتر را با هم مقایسه کنیم - پردازش همه عناصر در یک ردیف یا پردازش عناصر آرایه با یک عدد تصادفی به همان تعداد بار؟ این برنامه ideone.com/tMaR2S است. برای 100000 عنصر آرایه، دسترسی تصادفی معمولاً سریعتر است. این یعنی چی؟
    در اینجا کاملاً به درستی به من (Big_Lebowski) اشاره شد که تنظیم مجدد حلقه ها نتایج را به نفع گزینه ترتیبی تغییر می دهد. برای خلوص آزمایش، مجبور شدم چرخه گرم کردن را تنظیم کنم. در همان زمان، من چندین بار تکرار کردم تا میانگین زمان کار را همانطور که لونتوف توصیه کرد به دست بیاورم. اینجوری شد ideone.com/yN1H4g. آن ها دسترسی تصادفی به عناصر یک آرایه بزرگ 10% کندتر از دسترسی متوالی است. شاید کش واقعاً نقشی داشته باشد. با این حال، در وضعیت اولیه، عملکرد به طور قابل توجهی کاهش یافت. بنابراین چیز دیگری وجود دارد.

    به تدریج، نسخه مربوط به اقدامات اضافی هنگام انتقال از یک ردیف آرایه به ردیف دیگر در حال تبدیل شدن به رهبر است. و درست است. باقی مانده است که بفهمیم دقیقاً در آنجا چه اتفاقی می افتد.

    برچسب ها:

    • برنامه نويسي
    • آرایه ها
    • حافظه
    افزودن برچسب

    آرایه ها(آرایه ها) _ مجموعه های مرتب شده ای از عناصر از یک نوع هستند. عناصر یک آرایه می توانند اشیایی از انواع ساده و مرجع، از جمله Number و ارجاع به آرایه های دیگر باشند. آرایه ها خود اشیا هستند و

    کلاس Object را به ارث می برد. اعلامیه

    int ia = int جدید;

    آرایه ای به نام ia را تعریف می کند که در ابتدا به مجموعه ای از سه عنصر از نوع int اشاره می کند.

    اعلان آرایه ابعاد آن را نشان نمی دهد. تعداد عناصر آرایه زمانی مشخص می شود که با استفاده از عملگر جدید ایجاد شود. طول آرایه در زمان ایجاد ثابت است و بعدا نمی توان آن را تغییر داد. با این حال، متغیرنوع آرایه (در مثال ما - ia) یک آرایه جدید با ابعاد متفاوت را می توان در هر زمان اختصاص داد.

    عناصر آرایه با مقادیر اعداد شاخص آنها قابل دسترسی هستند.

    اولین عنصر آرایه دارای شاخص صفر (0) و آخرین عنصر دارای طول 1 است. یک عنصر آرایه با تعیین نام آرایه و مقدار شاخص، محصور در پرانتز مربع، [و] قابل دسترسی است. در مثال قبلی اولین عنصر آرایه ia ia و آخرین عنصر ia خواهد بود. هر زمان که یک عنصر آرایه از طریق فهرست قابل دسترسی باشد، زمان اجرا جاوا بررسی می‌کند که آیا مقدار شاخص در محدوده‌های قابل قبول است یا خیر و در صورت نادرست بودن نتیجه بررسی، استثنایی از نوع ArrayIndexOutOfBoundsException ایجاد می‌کند. 6 عبارت شاخص باید از نوع int باشد - این تنها چیزی است که حداکثر تعداد عناصر آرایه را محدود می کند.

    طول یک آرایه را می توان به راحتی با استفاده از فیلد طول شی آرایه (که به طور ضمنی با ویژگی های عمومی و نهایی ارائه می شود) تعیین کرد. در زیر کد به روز شده مثال قبلی وجود دارد که اجرای یک حلقه را فراهم می کند که اطمینان حاصل می کند که محتویات هر عنصر آرایه ia روی صفحه نمایش داده می شود:

    برای (int i = o; i< ia.length; i++)

    system.out.println(i + ": " + ia[i]);

    معمولاً آرایه ای با طول صفر (یعنی آرایه ای که هیچ عنصری ندارد) فراخوانی می شود خالی.توجه داشته باشید که مرجع آرایه تهی و مرجع آرایه خالی دو چیز کاملا متفاوت هستند. آرایه خالی یک آرایه واقعی است که به سادگی هیچ عنصری ندارد. یک آرایه خالی یک جایگزین مناسب برای null در هنگام بازگشت از یک متد فراهم می کند. اگر متدی قادر به برگرداندن null باشد، کد برنامه ای که متد را فراخوانی می کند باید قبل از ادامه عملیات باقی مانده، مقدار برگشتی را با null مقایسه کند. اگر متد یک آرایه (احتمالا خالی) را برمی گرداند، هیچ بررسی اضافی مورد نیاز نیست - البته به غیر از بررسی های مربوط به طول آرایه، که در هر صورت باید انجام شود.

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

    int ia = int جدید;

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

    اصلاح کننده ها در اعلان های آرایه

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

    آرایه های چند بعدی

    جاوا از قابلیت اعلان پشتیبانی می کند آرایه های چند بعدی(آرایه های چند بعدی) (یعنی آرایه هایی که عناصر آنها آرایه های دیگر هستند)، کدی که شامل اعلان یک ماتریس دو بعدی و نمایش محتویات عناصر آن می شود، برای مثال ممکن است به این صورت باشد:

    float mat = شناور جدید;

    setupMatrix(mat);

    برای (int y = o; y< mat.length; у++) {

    برای (int x = o; x< mat[y].length; х++)

    system.out.print(mat[y][x] + " ");

    system.out.println();

    هنگام ایجاد یک آرایه، حداقل اولین بعد آن، "سمت چپ" باید مشخص شود. ابعاد دیگر ممکن است مشخص نباشد - در این مورد باید بعداً تعیین شوند. مشخص کردن همه ابعاد به طور همزمان در عملگر جدید مختصرترین راه برای ایجاد یک آرایه است که به شما امکان می دهد از استفاده از عملگرهای جدید اضافی اجتناب کنید. عبارت برای اعلان و ایجاد آرایه mat در بالا معادل قطعه کد زیر است:

    float mat = شناور جدید;

    برای (int y = o; y< mat.length; у++)

    mat[y] = شناور جدید;

    این شکل از اعلان این مزیت را دارد که همراه با بدست آوردن آرایه هایی با ابعاد یکسان (مثلاً 4×4)، به شما امکان می دهد آرایه هایی از آرایه هایی با ابعاد مختلف برای ذخیره سازی توالی داده های خاص بسازید.

    مقداردهی اولیه آرایه ها

    هنگامی که یک آرایه ایجاد می شود، هر عنصر بسته به نوع آرایه یک مقدار پیش فرض دریافت می کند: صفر (0) برای انواع عددی، '\u0000'_ برای char، false برای بولی و null برای انواع مرجع. با اعلان یک آرایه از نوع مرجع، در واقع یک آرایه را تعریف می کنیم موقتاین نوع قطعه کد زیر را در نظر بگیرید:

    Attr attrs = Attr جدید;

    برای (int i = o; i< attrs.length; i++)

    attrs[i] = جدید Attr(نام[i]، مقادیر[i]);

    بعد از اجرای اولین عبارت حاوی عملگر جدید، متغیر attrs ارجاعی به آرایه ای از 12 متغیر خواهد داشت که به null مقداردهی اولیه می شوند.خود اشیاء Attr فقط با پیشرفت حلقه ایجاد می شوند.

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

    خطرات رشته = ("شیر"، "ببر"، "خرس");

    قطعه کد زیر همین نتیجه را خواهد داشت:

    خطرات رشته = رشته جدید; خطرات = "شیرها";

    خطرات = "ببر";

    خطرات = "خرس";

    فرم اول، که فهرستی از مقداردهی اولیه را در بریس‌های فرفری مشخص می‌کند، نیازی به استفاده صریح از عملگر جدید ندارد - به‌طور غیرمستقیم توسط سیستم زمان اجرا فراخوانی می‌شود. طول آرایه در این مورد با تعداد مقادیر اولیه تعیین می شود. همچنین می توان به صراحت عملگر جدید را مشخص کرد، اما همچنان باید از بعد حذف شود؛ مانند قبل، توسط سیستم اجرا تعیین می شود:

    خطرات رشته = رشته جدید ("شیرها"، "ببرها"، "خرس ها");

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

    printStringsCnew String ("یک"، "دو"، "سه"));

    آرایه بدون عنوانی که به این شکل ایجاد می شود نامیده می شود ناشناس(ناشناس).

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

    int pascalsTriangle = (

    { 1, 4, 6, 4, 1 },

    شاخص های آرایه های چند بعدی به ترتیب از بیرونی به درونی هستند. بنابراین، به عنوان مثال، pascalsTriangle)؛

    // مثالی برای نشان دادن ایجاد یک آرایه
    // اعداد صحیح، مقادیری را در یک آرایه قرار می دهد،
    // و هر مقدار را چاپ می کند.

    کلاس GFG
    {

    {

    int arr;

    // تخصیص حافظه برای 5 عدد صحیح.
    arr = int جدید;


    arr = 10;


    arr = 20;

    //به زودی...
    arr = 30;
    arr = 40;
    arr = 50;

    // دسترسی به عناصر آرایه مشخص شده
    برای (int i = 0; i< arr.length; i++)
    System.out.println("عنصر در نمایه" + i +
    " : "+ arr[i]);
    }
    }
    در نتیجه دریافت می کنیم:

    عنصر در شاخص 0: 10 عنصر در شاخص 1: 20 عنصر در شاخص 2: 30 عنصر در شاخص 3: 40 عنصر در شاخص 4: 50

    آرایه های اشیاء

    آرایه ای از اشیاء به روشی مشابه عناصر داده به شرح زیر ایجاد می شود:

    دانشجو arr = دانشجوی جدید;

    StudentArray شامل هفت عنصر حافظه هر یک از کلاس دانشجو است که آدرس های هفت شی Student را می توان در آنها ذخیره کرد. اشیاء دانشجویی باید با استفاده از سازنده کلاس دانشجو ایجاد شوند و ارجاعات آنها باید به صورت زیر به عناصر آرایه اختصاص داده شود:

    دانشجو arr = دانشجوی جدید;

    // برنامه جاوا برای نشان دادن ایجاد یک آرایه از
    // اشیاء

    دانش آموز کلاس
    {
    عمومی int roll_no;
    نام رشته عمومی;
    دانشجو (int roll_no، نام رشته)
    {
    this.roll_no = roll_no;
    this.name = نام;
    }
    }

    // عناصر آرایه اشیاء یک کلاس Student هستند.
    کلاس عمومی GFG
    {
    اصلی خالی استاتیک عمومی (آرگس های رشته ای)
    {
    // آرایه ای از اعداد صحیح را اعلام می کند.
    دانشجویی arr;

    // تخصیص حافظه برای 5 شی از نوع Student.
    arr = دانشجوی جدید;

    // اولین عناصر آرایه را مقداردهی اولیه کنید
    arr = دانشجوی جدید(1"aman");

    // عناصر دوم آرایه را مقداردهی اولیه کنید
    arr = دانشجوی جدید(2"vaibhav");

    // به زودی...
    arr = دانشجوی جدید(3"shikar");
    arr = دانشجوی جدید (4"dharmesh");
    arr = دانشجوی جدید (5"mohit");

    // دسترسی به عناصر آرایه مشخص شده
    برای (int i = 0; i< arr.length; i++)
    System.out.println("عنصر در " + i + " : " +
    arr[i].roll_no +" "+ arr[i].name);
    }
    }

    ما گرفتیم:

    عنصر در 0: 1 aman عنصر در 1: 2 vaibhav عنصر در 2: 3 shikar عنصر در 3: 4 dharmesh عنصر در 4: 5 mohit

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

    چند بعدی

    آرایه‌های چند بعدی، آرایه‌هایی از آرایه‌ها هستند که در آنها هر عنصر حاوی ارجاع به آرایه دیگری است. با افزودن یک مجموعه براکت مربع () برای هر بعد ایجاد می شود. بیایید به یک مثال نگاه کنیم:

    Int intArray = int جدید; //آرایه دو بعدی یا ماتریس int intArray = new int; //آرایه سه بعدی

    کلاس چند بعدی
    {
    اصلی خالی استاتیک عمومی (آرگس های رشته ای)
    {
    // اعلام و مقداردهی اولیه آرایه دو بعدی
    int arr = ((2,7,9),(3,6,1),(7,4,2));

    // چاپ آرایه دو بعدی
    برای (int i=0; i< 3 ; i++)
    {
    برای (int j=0; j< 3 ; j++)
    System.out.print(arr[i][j] + " ");

    System.out.println();
    }
    }
    }

    خروجی: 2 7 9 3 6 1 7 4 2


    ارسال آرایه ها به یک متد

    درست مانند متغیرها، می توانیم آرایه ها را به متدها منتقل کنیم.

    // برنامه جاوا برای نشان دادن // انتقال آرایه به کلاس متد Test ( // روش درایور public static void main(string args) ( int arr = (3, 1, 2, 5, 4); // ارسال آرایه به متد m1 sum(arr)؛ ) public static void sum (int arr) ( // گرفتن مجموع مقادیر آرایه int sum = 0; for (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

    در خروجی دریافت می کنیم:

    مجموع مقادیر آرایه: 15

    برگرداندن آرایه ها از متدها

    طبق معمول، متد می تواند یک آرایه را نیز برگرداند. برای مثال، برنامه زیر یک آرایه از متد m1 برمی گرداند.

    // برنامه جاوا برای نشان دادن // بازگشت آرایه از کلاس روش Test ( // روش درایور public static void main(string args) ( int arr = m1(); for (int i = 0; i< arr.length; i++) System.out.print(arr[i]+" "); } public static int m1() { // returning array return new int{1,2,3}; } }

    اشیاء کلاس

    هر آرایه دارای یک شی کلاس مرتبط است که با همه آرایه های دیگر با همان نوع جزء مشترک است.

    // برنامه جاوا برای نشان دادن // کلاس اشیاء برای آزمون کلاس آرایه ها ( باطل استاتیک عمومی اصلی (رشته آرگ) ( int intArray = int جدید؛ بایت بایت = بایت جدید؛ shortsArray کوتاه = کوتاه جدید؛ // آرایه رشته ها رشته strArray = رشته جدید؛ System.out.println(intArray.getClass())؛ System.out.println(intArray.getClass().getSuperclass()؛ System.out.println(byteArray.getClass())؛ System.out. println(shortsArray.getClass()); System.out.println(strArray.getClass()); ) )

    کلاس +" "); ))))

    کلون یک آرایه چند بعدی (مانند Object) یک کپی است، به این معنی که تنها یک آرایه جدید با هر عنصر و ارجاع به آرایه اصلی عناصر ایجاد می کند، اما آرایه های تو در تو مشترک هستند.

    // برنامه جاوا برای نشان دادن // شبیه سازی آرایه های چند بعدی کلاس Test ( public static void main(string args) ( int intArray = ((1,2,3),(4,5))؛ int cloneArray = intArray. clone(); // غلط را چاپ می کند System.out.println(intArray == cloneArray)؛ // درست را با ایجاد کپی کم عمق چاپ می کند // یعنی آرایه های فرعی به اشتراک گذاشته می شوند System.out.println(intArray == cloneArray) System.out.println(intArray == cloneArray)؛ )

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

    از آنجایی که جاوا در درجه اول OOP است، در مقایسه با آرایه ها در سایر زبان های برنامه نویسی یک ویژگی متمایز دارد - آنها به عنوان اشیا نشان داده می شوند. از جمله مزایای دیگر، این امر نیاز به نظارت بر پاکسازی حافظه را از بین می برد، زیرا به طور خودکار آزاد می شود.

    ایجاد و دستکاری آرایه های یک بعدی

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

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

    شماره گذاری عناصر در یک آرایه جاوا از 0 شروع می شود. بنابراین، شاخص اولین عنصر در این آرایه 0 و عنصر ششم - 5 خواهد بود. برای اشاره به عنصر خاصی از آرایه، به عنوان مثال، عنصر پنجم، فقط کافی است. نام آرایه و شاخص عنصر را در پرانتز در کنار نام نشان دهید. به این ترتیب هم می توانید یک مقدار به یک عنصر اختصاص دهید و هم آن را بازیابی کنید. با این حال، باید مراقب باشید زیرا اگر یک شاخص را ارسال کنید که عنصر در آن وجود نداشته باشد، خطا رخ می دهد.

    آرایه های چند بعدی در جاوا

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

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

    آرایه های نامنظم

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

    intarr = newint;

    لطفاً توجه داشته باشید که در پرانتز دوم عددی درج نکرده ایم. تعیین اندازه آرایه ها در arr به صورت زیر انجام می شود:

    با دسترسی به عنصر در شاخص 0 که به آرایه اول اشاره می کند، آن را به بعد 2 اعلام می کنیم. عنصر در شاخص 1 آرایه ای از بعد 3 و غیره را ذخیره می کند. این کاملا ساده است.

    نحو اعلان آرایه جاوا جایگزین

    همچنین می توانید هنگام ایجاد آرایه ها، آنها را مستقیماً مقداردهی اولیه کنید. خیلی ساده است.

    به اعلان آرایه های jerseyNumber و playerName توجه کنید.

    در مورد آرایه های دو بعدی، این اعلان به صورت زیر است:

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

    آرایه های کلاس کمکی

    برای کار با موجودیت هایی مانند آرایه ها در جاوا، بسته java.util دارای یک کلاس خاص به نام Arrays است که روش های ثابت بسیاری را ارائه می دهد که کار با آنها را بسیار آسان تر می کند. لیست روش های اصلی در شکل زیر ارائه شده است.

    بیایید به برخی از مفیدترین روش های آرایه جاوا نگاه کنیم:

    CopyOf (آرایه، طول) - یک کپی از آرایه ارسال شده با طول مربوطه را برمی گرداند. اگر طول ارسال شده بیشتر از آرایه اصلی باشد، تمام عناصر «اضافی» با یک مقدار پیش‌فرض پر می‌شوند (0 اگر نوع ساده است و تهی اگر نوع مرجع باشد).

    CopyOfRange (آرایه، اولین فهرست، آخرین فهرست) - در تصویر نشان داده نشده است، اما یک روش مفید است. بخشی از آرایه ارسال شده را کپی می کند، که با شاخص های مربوطه تعریف شده است، که از اول شروع می شود و به آخر ختم می شود.

    مرتب سازی (آرایه) - عناصر آرایه را به ترتیب صعودی مرتب می کند.

    Fill (آرایه، مقدار) - آرایه ارسال شده را با مقدار مناسب پر می کند.

    BinarySearch (آرایه، مقدار) - شاخصی را برمی‌گرداند که عنصر با مقدار متناظر در آرایه مرتب شده ارسال شده در آن قرار دارد. اگر چنین عنصری وجود نداشته باشد، یک عدد منفی برگردانده می شود.

    از آنجایی که متدها ثابت هستند، فراخوانی آنها نیازی به ایجاد نمونه ای از کلاس Arrays ندارد. آنها مستقیماً از آن نامیده می شوند: Arrays.sort(arr).

    نتیجه

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

    کلاس کمکی Array Java قبلاً در شرایط "مبارزه" استفاده می شود، بنابراین ابتدا توصیه می شود که یاد بگیرید چگونه تمام عملیات های اساسی را با آرایه ها به صورت دستی انجام دهید.

    ما یاد گرفتیم که چگونه آرایه های تک بعدی ایجاد کنیم. به طور مشابه، در جاوا می توانید 2D، 3D، 4D ... به عبارت دیگر، آرایه های چند بعدییک آرایه چند بعدی در جاوا اساساً آرایه ای از آرایه ها است.

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

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

    ماتریس یک جدول مستطیل شکل متشکل از سطرها و ستون هایی است که عناصر آن در محل تقاطع آنها قرار دارند. تعداد سطرها و ستون های یک ماتریس اندازه آن را تعیین می کند.

    نمای کلی اندازه ماتریس مترایکس n(m-تعداد خطوط، n -تعداد ستون ها) , به شرح زیر است:

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

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

    ماتریس آ دارای ابعاد 2 در 3 (2 ردیف، 3 ستون). بیایید یک آرایه دو بعدی از این بعد ایجاد کنیم:

    Int matrixA; matrixA = new int ;

    ما یک آرایه دو بعدی از اعداد صحیح را اعلام کردیم (از آنجایی که ماتریس در این مورد حاوی اعداد صحیح است) و حافظه را برای آن رزرو کردیم. برای این کار از 2 شاخص استفاده کردیم: شاخص اول ردیف و اندازه آن را مشخص می کند، اندیس دوم ستون و اندازه آن را مشخص می کند.

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

    MatrixA = 1; ماتریسA = -2; ماتریس A = 3; ماتریس A = 4; ماتریسA = 1; ماتریس A = 7;

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

    برای (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); }

    یعنی ابتدا تمام عناصر خط اول را با کاراکتر تب "\t" از هم جدا می کنیم، خط را شکسته و تمام عناصر خط دوم را نمایش می دهیم.

    کد کامل ماتریس آبه شرح زیر است:

    ماتریس کلاس عمومی (خلأ ثابت عمومی اصلی (رشته آرگ) (متریس A؛ ماتریس A = int جدید؛ ماتریس A = 1؛ ماتریس A = -2؛ ماتریس A = 3؛ ماتریس A = 4؛ ماتریس A = 1؛ ماتریس A = 7؛ برای (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); } } }

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

    ماتریس IntB = ( (-9,1,0), (4,1,1), (-2,2,-1));

    هر ردیف در آرایه باید در یک جفت پرانتز محصور شده و با کاما از هم جدا شوند.

    کد کامل ماتریس ب:

    ماتریس کلاس عمومی ( عمومی استاتیک void main (string args) ( int matrixB = ( (-9,1,0), (4,1,1), (-2,2,-1))؛ برای (int i = 0; من< 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixB[i][j] + "\t"); } System.out.println(); } } }

    در نظر بگیریم مقداردهی اولیه در یک حلقهبرای یک آرایه دو بعدی با استفاده از جدول ضرب به عنوان مثال.

    کلاس عمومی Mult ( public static void main (string args) ( // ایجاد یک آرایه دو بعدی 10 در 10 int multiplyTab = new int؛ // حلقه از بعد اول برای (int i = 0; i< 10; i++) { // цикл по второй размерности for (int j = 0; j < 10; j++) { //инициализация элементов массива multiplyTab[i][j] = (i+1)*(j+1); //вывод элементов массива System.out.print(multiplyTab[i][j] + "\t"); } System.out.println(); } } }

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

    آرایه های چند بعدی و نامتقارن.

    آرایه های چند بعدی در جاوا به روشی مشابه ایجاد می شوند. تعداد براکت ها ابعاد را نشان می دهد.
    نمونه هایی از ایجاد آرایه های با طول ثابت:

    Int a = int جدید؛// آرایه دو بعدی int b = int جدید؛// آرایه سه بعدی int c = جدید int؛// آرایه چهار بعدی // و غیره.

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

    Int a1 = int جدید؛ // آرایه دو بعدی با 5 ردیف

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

    A1 = int جدید ; a1 = int جدید ; a1 = int جدید ; a1 = int جدید ; a1 = int جدید ;

    در نتیجه وقتی روی صفحه نمایش داده می شود،

    برای (int i = 0; i

    آرایه به شکل زیر خواهد بود:

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

    هنگامی که یک آرایه ایجاد می شود، عناصر آن به طور خودکار صفر می شوند، بنابراین در این مثال صفرها نمایش داده می شوند.

    تمرینات آرایه های چند بعدی در جاوا:

    1. یک آرایه 5 در 6 ایجاد کنید و آن را با اعداد تصادفی (از 0 تا 99) پر کنید. خط سوم را روی کنسول چاپ کنید
    2. ماتریس های C و D با ابعاد 3 در 3 و پر از اعداد تصادفی در محدوده 0 تا 99 هستند. جمع را جداگانه انجام دهید، سپس ماتریس ها را در یکدیگر ضرب کنید. خروجی ماتریس های منبع و نتایج محاسباتی به کنسول.
    3. تمام عناصر یک آرایه دو بعدی را جمع کنید.
    4. یک آرایه دو بعدی حاوی اعداد منفی و مثبت داده می شود. نمایش تعداد سلول های آرایه ای که دارای اعداد منفی هستند.
    5. عناصر موجود در ردیف های یک آرایه دو بعدی را به ترتیب صعودی مرتب کنید

    بهترین مقالات در این زمینه