JavaRush /Java блогы /Random-KK /Көпөлшемді массивтер

Көпөлшемді массивтер

Топта жарияланған
Көпөлшемді массивтер – 1

Бір өлшемді Java массиві дегеніміз не?

Массив – бір типті элементтердің реттелген жиыны, қарабайыр немесе сілтеме. Массивтер (негізінен бір өлшемді) туралы жалпы ақпаратты « Java тіліндегі массивтер » мақаласынан және JavaRush курсынан табуға болады . Бұл мақалада элементтері басқа массивтер болып табылатын массивтер туралы айтатын боламыз. Мұндай массивтер көпөлшемді деп аталады. Элементтері басқа массивтер, яғни массивтер массиві болып табылатын массив екі өлшемді деп аталады. Барлық тілдерде осылай құрылымдалған көп өлшемді массивтер жоқ, бірақ Java-да бұл жағдай.

Java көпөлшемді массивтері, жалпы синтаксисі

Жалпы, Java тіліндегі көп өлшемді массивтер келесідей көрінеді:
Data_type[dimension1][dimension2][]..[dimensionN] array_name = new data_type[size1][size2].[sizeN];
Data_typeМассивтегі элементтердің түрі қайда орналасқан. Қарапайым немесе сілтеме (сынып) болуы мүмкін. Ішкі жақша жұптарының саны dimensionмассивтің өлшемі болып табылады (біздің жағдайда - N). array_name— массив аты size1...sizN— массивтің әрбір өлшеміндегі элементтер саны. Көпөлшемді массивтерді жариялау:
int[][] twoDimArray; //two-dimensional array
String[][][] threeDimArray; //three-dimensional array
double[][][][][] fiveDimArray; // five-dimensional array
Мұның бәрі өте дерексіз болып көрінуі мүмкін, сондықтан көп өлшемді массивтердің нақты көріністеріне көшейік - екі өлшемді және үш өлшемді. Өйткені, Java әзірлеушілері кейде екі өлшемді массивтерді пайдаланады, сирек - үш өлшемді, ал одан да үлкен массивтер өте сирек кездеседі. Сіз оларды кездестірмеу ықтималдығы жоғары.

JavaRush курсындағы көп өлшемді массивтер

JavaRush бағдарламасында «қарапайым» массивтер Java синтаксисі квестінің 7 деңгейінде іске қосылады және кейінірек курста олар бірнеше рет кездеседі. Кейде курс барысында сіз екі өлшемді массивтерге (немесе олардың көмегімен шешуге болатын) қатысты мәселелерге тап боласыз. Екі өлшемді массивтер « JavaRush-тегі ойындар » арнайы бөлімінің ойын қозғалтқышында да қолданылады . Егер сіз әлі ол жерде болмасаңыз, қараңыз және бір-екі ойын жасаңыз. Шарттар мен шарттар егжей-тегжейлі нұсқаулармен бірге келеді және бағдарламалау дағдыларын тамаша оқытуды қамтамасыз етеді. Үш өлшемді массивті Space Invaders ойынынан табуға болады . Ол арқылы анимацияға арналған кадрлар жиынтығы көрсетіледі (және бұл кадрлардың әрқайсысы екі өлшемді массив болып табылады). JavaSyntax квестін әлдеқашан аяқтаған болсаңыз немесе Java бағдарламалауына сенімді болсаңыз, осы классикалық ойынның жеке нұсқасын жазып көріңіз.

Екі өлшемді Java массиві дегеніміз не?

Java тіліндегі екі өлшемді массив массивтердің массиві болып табылады, яғни әрбір ұяшықта массивке сілтеме бар. Бірақ оны жолдар саны (бірінші өлшем) және бағандар саны (екінші өлшем) бар кесте түрінде ұсыну әлдеқайда оңай. Барлық жолдарда бірдей элементтер саны бар екі өлшемді массив тікбұрышты деп аталады.

Екі өлшемді массивтерді жариялау, құру және инициализациялау

Екі өлшемді массивті жариялау және құру proceduresасы бір өлшемді жағдайдағыдай дерлік:
int[][] twoDimArray = new int[3][4];
Бұл массивте 3 жол және 4 баған бар. Тіктөртбұрышты екі өлшемді массивтің өлшемі (олар тікбұрышты болмауы мүмкін, төменде толығырақ), яғни элементтердің жалпы санын жолдар санын бағандар санына көбейту арқылы анықтауға болады. Ол енді әдепкі мәндермен инициализацияланған (толтырылған). Яғни, нөлдер. Оны бізге қажетті құндылықтармен толтырайық.
twoDimArray[0][0] = 5;//write the value 5 into the cell at the intersection of the zero row and zero column
twoDimArray[0][1] = 7; //write the value 7 into the cell at the intersection of the zero row and the first column
twoDimArray[0][2]  = 3;
twoDimArray[0][3] = 17;
twoDimArray[1][0] = 7;
twoDimArray[1][1] = 0;
twoDimArray[1][2] = 1;
twoDimArray[1][3] = 12;
twoDimArray[2][0] = 8;
twoDimArray[2][1] = 1;
twoDimArray[2][2] = 2;
twoDimArray[2][3] = 3;
Бір өлшемді массивтер сияқты, инициализация proceduresасын жылдамырақ орындауға болады:
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
Екі жағдайда да біз бүтін сандармен толтырылған үш жолдан және төрт бағаннан тұратын екі өлшемді массив аламыз. Көпөлшемді массивтер – 2

Экранда екі өлшемді массив көрсету

Бұл операцияны орындаудың ең логикалық жолы - алдымен нөлдік жол элементін элемент бойынша шығару, содан кейін екіншісін және т.б. Java-да екі өлшемді массив шығарудың ең көп тараған жолы екі кірістірілген циклды пайдалану болып табылады.
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};//declared an array and filled it with elements
for (int i = 0; i < 3; i++) {  //go through the lines
            for (int j = 0; j < 4; j++) {//go through the columns
                System.out.print(" " + twoDimArray[i][j] + " "); //output element
            }
            System.out.println();// line wrap for the visual preservation of the tabular form
        }

Екі өлшемді массивтің жылдам шығуы

Экранда екі өлшемді массив элементтерінің тізімін көрсетудің ең қысқа жолы deepToStringкласс әдісін пайдалану болып табылады Arrays. Мысалы:
int[][] myArray = {{18,28,18},{28,45,90},{45,3,14}};
System.out.printLn(Arrays.deepToString(myArray));
Бағдарламаның нәтижесі келесі нәтиже болып табылады: [[18, 28, 18], [28, 45, 90], [45, 3, 14]]

Екі өлшемді массивтің «ұзындықтары».

Бір өлшемді массивтің ұзындығын (яғни ондағы элементтердің санын) алу үшін айнымалы мәнін пайдалануға болады length. Яғни, егер біз массивті анықтасақ int a[] = {1,2,3}, онда операция a.length3 мәнін қайтарады. Бірақ екі өлшемді массивке бірдей proceduresаны қолдансақ ше?
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
System.out.println(twoDimArray.length);
Шығару: 3 Осылайша, бұл әрекет массивтегі жолдар санын шығарады. Бағандар санын қалай алуға болады? Егер біз тікбұрышты екі өлшемді массивтермен (яғни барлық сызықтары бірдей ұзындықтағы массивтермен) айналысатын болсақ, онда біз операцияны twoDimArray[0].lengthнемесе нөлдік элементтің орнына (негізі нөлдік сызық) - кез келген басқаны қолдана аламыз. Біз мұны істей аламыз, себебі Java тілінде екі өлшемді массив массивтер массиві, ал нөл элементі twoDimArray[0]ұзындығы 4 массив болып табылады. Мұны өзіңіз тексере аласыз.

Екі өлшемді массивті пайдалану мысалы: шахмат тақтасы

Екі өлшемді массивтерді кез келген соңғы екі өлшемді өрісті құру үшін пайдалануға болады, мысалы, ойындарда, атап айтқанда шахматта. Шахмат тақтасын екі өлшемді массив деп ойлау оңай. Бұған графиканы «тіркеуге» болады, бірақ әзірге таңбаларды пайдаланып шахмат тақтасын анықтап, оны консольге шығарайық. Көпөлшемді массивтер – 3Шахмат тақтасының төменгі сол жақ шаршысы қара түске боялған, келесісі оның үстіндегідей ақ. Осылайша, сіз жанындағы ұяшыққа өткен сайын түс өзгереді. Шахматтың бояуын қолмен емес, алгоритмді пайдаланып орнату үшін паритет тексеруін қолдануға болады: жол мен баған индексінің қосындысы жұп немесе нөл болса, ұяшық ақ болады, әйтпесе ол қара болады. Бұл тексеру үшін алгоритмде % қалдық операторын қолданамыз. Біз графикамен емес, символдармен жұмыс істейтіндіктен, ақ ұяшықты әріппен W(ақ), ал қара ұяшықты әріппен B(қара) белгілейміз.
//set the chessboard as a two-dimensional array
String [][] chessBoard = new String[8][8];
        for (int i = 0; i< chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W";
                else chessBoard[i][j] = "B";
            }
        }
Бағдарламаның шығуы келесідей: WBWBWBWBBWBWBWBWWBWBW BWBBWBWBWBWWBWBWBWBBW BWBWBWBWBWBWBBWBWBWB W Барлығы нағыз шахмат тақтасындағыдай, оны тексеруге болады. Көпөлшемді массивтер – 4Енді ұяшықтарды массив тілінде емес, «шахмат» тілінде дұрыс нөмірлеу әдісін жазайық. Тақтадағы төменгі сол жақ ұяшық A1 деп аталады, ал біздің массивте ол chessBoard[7][0]. Екі өлшемді массивтің индекстерінің әрбір жұбын олардың «шахмат» эквивалентімен байланыстырайық. Ол үшін біз екі жолды қолданамыз - « abcdefgh» және « 87654321» (кері тәртіпте - қарапайымдылық үшін, 8 шахмат тақтасы нөлдік бағанға сәйкес келеді).
public static String chessBoardCoord(int a, int b) {
            String letters = "abcdefgh";
            String numbers = "87654321";
            if ((a > 7)|| (b>7)) return null; //if the number is outside the board, return the default value - null
            else return (Character.toString(letters.charAt(a)) + numbers.charAt(b)); /*charAt - a method with which we extract from the string the element under the passed number, here - under the numbers a and b. Character.toString - a method that converts the received character into a string */
        }
Енді әдіс арқылы әр ұяшықта оның түсін ғана емес, санын да көрсетейікchessBoardCoord
String [][] chessBoard = new String[8][8];
        for (int i = 0; i < chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W" + chessBoardCoord(j,i);
                else chessBoard[i][j] = "B"+ chessBoardCoord(j,i);
            }
        }

            for (int i = 0; i < chessBoard.length; i++) {
                for (int j = 0; j < chessBoard[0].length; j++) {
                    System.out.print(" " + chessBoard[i][j] + " ");
                }
                System.out.println();
            }
Бағдарламаның шығысы: Wa8 Bb8 Wc8 Bd8 We8 Bf8 Wg8 Bh8 Ba7 Wb7 Bc7 Wd7 Be7 Wf7 Bg7 Wh7 Wa6 Bb6 Wc6 Bd6 We6 Bf6 Wg6 Bh6 Ba5 Wb5 Bc5 Wd5 Be5 Wf5 Bg5 Wh5 Wa4 Bb4 Wc B3 Wh5 Wa4 Bb4 Wc B4d 3 Be3 Wf3 Bg3 Wh3 Wa2 Bb2 Wc2 Bd2 We2 Bf2 Wg2 Bh2 Ba1 Wb1 Bc1 Wd1 Be1 Wf1 Bg1 Wh1 Мұндағы We2e2 нөмірлі ақ шаршыны білдіреді.

Екі өлшемді массивті қолдану мысалы: матрицаны көбейту

Назар аударыңыз!Бұл мысал матрицалар туралы негізгі білімді талап етеді. Мұнда олар туралы өте аз айтылады және бұл ақпарат матрицалық арифметиканы оқыған, бірақ біраз ұмытып кеткендерге арналған. Дегенмен, бұл білімді ашық көздерден, атап айтқанда Уикипедиядағы мақаладан алуға болады . Бұл екі өлшемді массивтерді пайдаланудың жақсы мысалы, бірақ біз онсыз да қозғала аламыз. Сондықтан математикалық тұрғыдан бұл сізге түсініксіз болып көрінсе және сіз оны шынымен зерттегіңіз келмесе, мысалды өткізіп жіберіңіз. Егер сіз негізгі сызықтық алгебраны оқыған болсаңыз, тікбұрышты матрицалар ретінде тікбұрышты массивтер туралы білген болуыңыз мүмкін. Көпөлшемді массивтер – 5Мұндағы a11, a12... aNN кейбір сандар. Суретте матрица тіпті тікбұрышты емес, шаршы (жолдар саны бағандар санына тең, бірақ бұл әрдайым бола бермейді). Шынайы өмірде мұндай матрицалар сирек кездеседі, бірақ бағдарламалау мен информатикада олар өте жиі кездеседі. Атап айтқанда, олар компьютерлік графика мен ойын қозғалтқыштарында қолданылады. Мысалы, экрандағы нысанның кез келген бұрышқа айналуын айналу матрицасы арқылы бағдарламалауға болады. Екі өлшемді кеңістікте айналу матрицасы келесідей көрінеді: Көпөлшемді массивтер – 6Мұндағы тета - an objectіні айналдыру қажет бұрыш. Өлшемдері бірдей матрицаларды бір-біріне қосуға болады және қосу элемент бойынша жүреді (бірдей индекстері бар элементтерді қосамыз). Бірақ матрицаны көбейту операциясы аз таныс. Осылайша, бірінші матрицаның бағандарының саны екінші матрицаның жолдарының санына сәйкес келсе ғана матрицаларды көбейтуге болады және нәтижелі матрицаны алуға болады. Нәтиже матрицасында біріншісі сияқты жолдар саны және екіншісі сияқты бағандар саны бірдей болады. Көбейту келесідей орындалады. a[l][m]Бізге және матрицасы болсын b[m][n]. Оларды көбейту нәтижесінде біз матрицаны алуымыз керек c[l][n]. Өнім матрицасының элементін алу үшін бірінші матрицаның нөлдік жолының нөлдік элементін екінші матрицаның нөлдік элементіне көбейту c[0][0]керек a[0][0], содан кейін бірінші матрицаның бірінші жолының бірінші элементін бірінші элементке көбейту керек. екінші матрицаның бірінші бағанының және т.б., содан кейін барлық алынған өнімдер қосылады.

a[0][0]*b[0][0] + a[0][1]*b[1][0] + … + a[0][m-1]*b[m-1][0]
Нәтиже матрицасының бірінші жолының екінші элементін алу үшін екінші қатармен бірдей proceduresаны орындаймыз

a[1][0]*b[0][0] + a[1][1]*b[0][1] + … + a[0][m-1]*b[m-1][0]
Сонымен қатар жолдың соңына дейін. Содан кейін біз келесі жолға өтіп, жолдар біткенше proceduresаны қайталаймыз. Яғни, бірінші матрицаның жолдарын екінші матрицаның бағандарымен көбейтеміз. Төменде матрицаны көбейту codeы берілген. Оны жолдар мен бағандар саны бойынша жоғарыда аталған шартқа сәйкестігін тексерумен толықтыруға болады.
//declaring two matrices
int [][] twoDimArray1 = {{1,0,0,0},{0,1,0,0},{0,0,0,0}};
int[][] twoDimArray2 = {{1,2,3},{1,1,1},{0,0,0},{2,1,0}};

//matrix multiplication process
int[][]twoDimArray3 = new int [twoDimArray1.length][twoDimArray2[0].length];
        for (int i=0; i<twoDimArray3[0].length; i++)
            for (int j=0; j<twoDimArray3.length; j++)
                for (int k=0; k<twoDimArray1[0].length; k++)
                              twoDimArray3[i][j] = twoDimArray3[i][j] + twoDimArray1[i][k] * twoDimArray2[k][j];

//output on display
        for (int i = 0; i < twoDimArray3.length; i++) {
            for (int j = 0; j < twoDimArray3[0].length; j++) {
                System.out.print(" " + twoDimArray3[i][j] + " ");
            }
            System.out.println();
        }
Бағдарлама келесі нәтижені шығарады: 1 2 3 1 1 1 0 0 0

Тікбұрышты емес екі өлшемді массивтер

Java тіліндегі екі өлшемді массивтер массивтердің массивтері болғандықтан, ішкі массивтердің әрқайсысы әртүрлі ұзындықтарда болуы мүмкін. Массивті құру кезінде біз бағандардың санын емес, тек жолдар санын ғана көрсете аламыз (яғни, дәл осы жолдардың ұзындығы). Мысал қарастырайық.
//declaring and creating an array, specifying only the number of rows
int [][] twoDimArray = new int[5][];

//initialize the array, filling it with arrays of different lengths
        twoDimArray[0] = new int[]{1, 2, 3, 4, 5};
        twoDimArray[1] = new int[]{1,2,3,4};
        twoDimArray[2] = new int[]{1,2,3};
        twoDimArray[3] = new int[]{1,2};
        twoDimArray[4] = new int[]{1};
//display the resulting non-rectangular two-dimensional array on the screen
        for (int i = 0; i < twoDimArray.length; i++) {
            for (int j = 0; j < twoDimArray[i].length; j++) {
                System.out.print(" " + twoDimArray[i][j] + " ");
            }
            System.out.println();
        }
Бағдарламаның шығысы: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 Осылайша, массивіміздің нөлдік жолында массив {1,2,3,4,5}, ал төртінші жолда массив бар {1}.

Java тіліндегі үш өлшемді массивтер

Жалпы мағынаға және Java тілінің логикасына сүйене отырып, үш өлшемді массив «массивтер массивтері» немесе «әрбір элементі екі өлшемді массив болып табылатын массив» деп атауға болады. Сонымен қатар, бұл екі өлшемді массивтер әртүрлі болуы мүмкін. Мысалы:
// create a three-dimensional array consisting of two two-dimensional arrays
int[][][] threeDimArr = new int[2][][];
//create the first 2D array of a 5x2 3D array
        threeDimArr[0] = new int[5][2];
//create a second 2D array of a 1x1 3D array
        threeDimArr[1] = new int[1][1];
Бірақ көбінесе іс жүзінде барлық үш шама бірден анықталған үш өлшемді массивтер бар, тікбұрышты екі өлшемді массивтердің аналогы. Көпөлшемді массивтер – 7Жоғарыда айтқанымыздай, үш өлшемді немесе одан да көп массивтер өте сирек қолданылады. Дегенмен, сіз 3D массивімен қызықты нәрсені бағдарламалай аласыз. Мысалы, көп қабатты автотұрақ. Әрбір қабатты екі өлшемді массив деп санауға болады, ал автотұрақ үш өлшемді массивтің белгілі бір элементі ретінде қарастырылуы мүмкін. Мұндай массивтің элементі бос орын бос болса, falseboolean мәнімен , ал егер бос орын болса, шын мәнімен ұсынылуы мүмкін.
//set a boolean three-dimensional array. This car park has 3 floors, each of which can accommodate 2x5 = 10 cars. By default, all cells are empty (false)
boolean[][][] parkingLot = new boolean[3][2][5];
//two cars arrived and parked on the ground floor in cell [1][0] and [1][3]
        parkingLot[0][1][0] = true;
        parkingLot[0][1][3] = true;

//Output the array to the console
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 5; k++) {
                    System.out.print("arr[" + i + "][" + j + "][" + k + "] = " + parkingLot[i][j][k] + "\t");

                }
                System.out.println();
            }
        }

Java бағдарламашысының нақты жұмысындағы көпөлшемді массивтер

Шындығында, Java әзірлеушілерінің көпшілігі көп өлшемді массивтерді жиі кездестірмейді. Дегенмен, бұл деректер құрылымы өте жақсы сәйкес келетін бірқатар тапсырмалар бар.

  1. Белгілі бір алгоритмді тексеру үшін сынақтар және матрицаларды тұрақтылар ретінде орнату үшін.
  2. Кейде нейрондық желілер үшін көп өлшемді массивтер қолданылады.
  3. Көпөлшемді массивтер мұрағатшылар үшін қолайлы.
  4. Суреттермен жұмыс.

Екі өлшемді және үш өлшемді массивтерге арналған қызықты есептер

Сіз Java тіліндегі көп өлшемді массивтер туралы жеткілікті білесіз және өзіңізді сенімді сезінсеңіз, төмендегі кейбір мәселелерді шешуге тырысуға болады. Олар оңай емес, бірақ қызықты. Тик-так-аяқ. 3x3 алаңын орнатыңыз, кезекпен жүретін екі ойыншы жасаңыз. Бастапқыда алаң бос, ал бос өрістердің әрқайсысында бірінші ойыншы крест, ал екіншісі нөл қоя алады. Бір қатарда, бір бағанда немесе диагональ бойынша орналасқан үш крест немесе үш нөлді бірінші жинаған адам жеңімпаз болады. Лэнгтон құмырсқасы . Ұяшықтарға бөлінген белгілі бір өріс бар (екі өлшемді массив), қара немесе ақ түске боялған (кездейсоқ функция арқылы орнатуға болады). «Құмырсқа» ұяшықтардың бірінде кездейсоқ материалданады және әр қадамда ол төрт бағыттың бірімен көрші ұяшыққа көлденең немесе тігінен қозғала алады. Құмырсқалардың қозғалысы ережелері:
  • Қара шаршыда құмырсқа 90° солға бұрылып, ұяшықтың түсін ақ түске өзгертіп, келесі шаршыға алға қадам басуы керек.
  • Ақ шаршыда құмырсқа 90° оңға бұрылып, ұяшықтың түсін қара түске өзгертеді, содан кейін келесі шаршыға алға қадам жасайды.
nҚұмырсқаның бастапқы орнын ескере отырып, қадам нөмірі бойынша итерацияны есептейтін әдісті жазыңыз . Өрісті нөлдермен және бірліктермен кездейсоқ толтыруға болады (немесе шахмат тақтасындағы мысалдағыдай Wжәне әріптерімен белгіленеді). BБізге тағы екі параметр қажет - құмырсқаның көлденең және тік орналасуы, сонымен қатар оның осы қадамдағы бағыты (солтүстік, оңтүстік, батыс, шығыс), ал әдепкі бойынша құмырсқа солтүстікке қарайды. Рубик текшесін үш өлшемді массивтер арқылы модельдеуге болады. Стандартты рубик текшесінің 6 беті бар және олардың әрқайсысы түрлі-түсті квадраттардың үш өлшемді массиві Color[][][] rubik = new Color[6][3][3]. Дегенмен, Рубик текшесін жүзеге асыру тривиальды тапсырма емес.

Массивтер туралы пайдалы материалдар

JavaRush туралы көптеген мақалалар массивтерге арналған (негізінен бір өлшемді, өйткені олар практикада жиірек қолданылады). Оларға назар аударыңыз.
  1. Java тіліндегі массивтер – мысалдары бар жаңадан бастаушыларға арналған массивтер туралы
  2. Массивтер туралы бірдеңе - массивтер туралы жақсы егжей-тегжейлі мақала
  3. Arrays класы және оны қолдану - мақалада сыныптың кейбір әдістері сипатталғанArray
  4. Массивтер – массивтерге арналған JavaRush-тың алғашқы лекциясы.
  5. Нөлдік емес, нөлдік ұзындықтағы массивді қайтарыңыз - Тиімді бағдарламалау авторы Джошуа Блох бос массивтерді қалай жақсы қайтару керектігі туралы айтады
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION