JavaRush /Java Blog /Random-TK /Köp ölçegli massiwler

Köp ölçegli massiwler

Toparda çap edildi
Köp ölçegli massiwler - 1

Bir ölçegli Java massiwi näme?

Bir massiw, birmeňzeş ýa-da salgylanma görnüşindäki elementleriň sargyt edilen toplumydyr. Toplumlar barada umumy maglumatlary (esasan bir ölçegli) “ Java-daky massiwler ” makalasynda we JavaRush kursynda tapyp bilersiňiz . Bu makalada elementleri beýleki massiwler bolan massiwler barada gürleşeris. Şeýle massiwlere köp ölçegli diýilýär. Elementleri beýleki massiwler, ýagny massiwler massiwine iki ölçegli diýilýär. Languageshli dillerde köp ölçegli massiwler beýle düzülenok, ýöne Java-da şeýle.

Java köp ölçegli massiwler, umumy sintaksis

Umuman, Java-da köp ölçegli massiwler şeýle görünýär:
Data_type[dimension1][dimension2][]..[dimensionN] array_name = new data_type[size1][size2].[sizeN];
Data_typeToplumdaky elementleriň görnüşi nirede . Ilkinji ýa-da salgylanma (synp) bolup biler. Içindäki jübüt ýaýlaryň sany, dimensionmassiwiň ölçegidir (biziň ýagdaýymyzda N). array_name- massiwiň ady size1...sizN- massiwiň her ölçegindäki elementleriň sany. Köp ölçegli massiwleri yglan etmek:
int[][] twoDimArray; //two-dimensional array
String[][][] threeDimArray; //three-dimensional array
double[][][][][] fiveDimArray; // five-dimensional array
Perhapshtimal, bularyň hemmesi gaty abstrakt görünýär, şonuň üçin geliň indi köp ölçegli massiwleriň anyk görnüşlerine geçeliň - iki ölçegli we üç ölçegli. Hakykat, Java döredijiler käwagt iki ölçegli massiwleri ulanýarlar, köplenç az - üç ölçegli, hatda has uly massiwler hem seýrek bolýar. Olara duş gelme ähtimallygyňyz ýokary.

JavaRush kursynda köp ölçegli massiwler

JavaRush-da “adaty” massiwler Java Sintaksis gözleginiň 7-nji derejesinde başlaýar , soň bolsa kursda bir gezekden köp duş gelýär. Käwagt kursuň dowamynda iki ölçegli massiwlere (ýa-da olaryň kömegi bilen çözülip bilinjek) meselelere duş gelýärsiňiz. Iki ölçegli massiwler “ JavaRush-da oýunlar ” ýörite bölüminiň oýun dwigatelinde hem ulanylýar . Entek ýok bolsaňyz, göz aýlaň we bir-iki oýun dörediň. Şertler jikme-jik görkezmeler bilen gelýär we programmirleme endikleri boýunça ajaýyp tälim berer. Üç ölçegli massiw “Space Invaders” oýunda tapylyp bilner . Onuň üsti bilen animasiýa üçin çarçuwalar toplumy kesgitlenýär (we bu ramkalaryň her biri iki ölçegli massiwdir). JavaSyntax gözlegini eýýäm tamamlan bolsaňyz ýa-da diňe Java programmirlemegine ynamly bolsaňyz, bu klassiki oýnuň öz wersiýasyny ýazyp görüň.

Iki ölçegli Java massiwi näme?

Java-da iki ölçegli massiw, bir massiwdir, ýagny her öýjükde bir massiw bar. Itöne berlen hatar sany (birinji ölçeg) we sütünleriň sany (ikinji ölçeg) bolan tablisa görnüşinde hödürlemek has aňsat. Rowhli hatarlarda deň mukdarda elementlere eýe bolan iki ölçegli massiw gönüburçly diýilýär.

Iki ölçegli massiwleri yglan etmek, döretmek we başlamak

Iki ölçegli massiw yglan etmegiň we döretmegiň tertibi bir ölçegli massiwdäki ýalydyr:
int[][] twoDimArray = new int[3][4];
Bu massiwde 3 hatar we 4 sütün bar. Gönüburçly iki ölçegli massiwiň ululygy (gönüburçly bolup bilmez, aşakda has köp bolmagy mümkin), ýagny elementleriň umumy sanyny hatarlaryň sanyny sütünleriň sanyna köpeltmek arkaly kesgitläp bolýar. Indi başlangyç bahalar bilen başlanýar (doldurylýar). .Agny nollar. Geliň, zerur gymmatlyklar bilen dolduralyň.
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;
Bir ölçegli massiwlerde bolşy ýaly, başlangyç prosedurasyny has çalt ýerine ýetirip bilersiňiz:
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
Iki ýagdaýda-da bitewi sanlar bilen doldurylan üç hatar we dört sütünli iki ölçegli massiw alarys. Köp ölçegli massiwler - 2

Ekranda iki ölçegli massiw görkezmek

Bu amaly amala aşyrmagyň iň logiki usuly, ilki bilen nol çyzyk elementini element boýunça, soň ikinjisini we ş.m. çykarmakdyr. Java-da iki ölçegli massiw çykarmagyň iň ýaýran usuly, iki sany aýlawly aýlaw ulanmakdyr.
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
        }

Iki ölçegli massiwiň çalt çykmagy

Ekranda iki ölçegli massiwiň elementleriniň sanawyny görkezmegiň iň gysga usuly deepToStringsynp usulyny ulanmakdyr Arrays. Mysal:
int[][] myArray = {{18,28,18},{28,45,90},{45,3,14}};
System.out.printLn(Arrays.deepToString(myArray));
Maksatnamanyň netijesi aşakdaky çykyş: [[18, 28, 18], [28, 45, 90], [45, 3, 14]]

Iki ölçegli massiwiň “uzynlygy”

Bir ölçegli massiwiň uzynlygyny almak üçin (ýagny içindäki elementleriň sany) üýtgeýjini ulanyp bilersiňiz length. .Agny, bir massiw kesgitlän bolsak int a[] = {1,2,3}, amal a.lengthgaýdyp geler. Butöne şol bir prosedurany iki ölçegli massiwimize ulansak näme etmeli?
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
System.out.println(twoDimArray.length);
Çykyş: 3 Şeýlelik bilen bu amal massiwdäki hatar sanyny çykarýar. Sütünleriň sanyny nädip almaly? Eger gönüburçly iki ölçegli massiwler bilen iş salyşýan bolsak (ýagny, ähli setirler birmeňzeş uzynlykdaky setirler), onda amaly twoDimArray[0].lengthýa-da nol elementiň ýerine (esasan nol çyzyk) - başga bar bolanlary ulanyp bileris. Muny edip bileris, sebäbi Java-da iki ölçegli massiw massiw, nol element bolsa twoDimArray[0]uzynlyk massiwidir. Muny özüňiz barlap bilersiňiz.

Iki ölçegli massiw ulanmagyň mysaly: barlag paneli

Iki ölçegli massiwler islendik çäkli iki ölçegli meýdan döretmek üçin ulanylyp bilner, mysal üçin oýunlarda we esasanam küştde. Küşt tagtasyny iki ölçegli massiw diýip pikir etmek aňsat. Muňa grafikany “dakyp” bilersiňiz, ýöne häzirlikçe simwollary ulanyp küşt tagtasyny kesgitläliň we konsola çykalyň. Köp ölçegli massiwler - 3Küşt tagtasynyň aşaky çep kwadraty gara reňk bilen boýalýar, indiki ýeri ýokardaky ýaly ak bolýar. Şeýlelik bilen, her gezek gapdalyndaky öýjüge geçeniňizde reňk üýtgeýär. Küşt reňkini el bilen däl-de, algoritm ulanyp, deňlik barlagyny ulanyp bilersiňiz: hataryň we sütün indeksiniň jemi hatda ýa-da nol bolsa, öýjük ak bolar, ýogsam gara bolar. Bu barlag üçin galan operatory% algoritmde ulanýarys. WGrafika bilen däl-de, simwollar bilen işleýändigimiz üçin ak öýjügi (ak) harp bilen, gara öýjügi (gara) harpy bilen aňladarys 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";
            }
        }
Programmanyň netijesi şeýleräk: WBWBWBWBBWBWBWBWWWBWBW BWBBWBWBBWWWWBWBWBBWW Köp ölçegli massiwler - 4Indi öýjükleri massiw dilinde däl-de, “küşt” dilinde dogry sanamagyň usulyny ýazalyň. Tagtanyň aşaky çep öýjügine A1 diýilýär, biziň hatarymyzda bolsa chessBoard[7][0]. Iki ölçegli massiwiň her jübütini “küşt” ekwiwalenti bilen baglanyşdyralyň. Munuň üçin iki setir ulanýarys - " abcdefgh" we " 87654321" (ters tertipde - ýönekeýlik üçin, 8-nji bellik tagtasy nol sütüne gabat gelýär).
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 */
        }
Indi her bir öýjükde usuly ulanyp, diňe bir reňkini däl, eýsem sanyny hem görkezeliň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();
            }
Programmanyň çykyşy: 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 Be4 W4 B4 W4 B4 W4 B4 W4 Wf3 Bg3 Wh3 Wa2 Bb2 Wc2 Bd2 We2 Bf2 Wg2 Bh2 Ba1 Wb1 Bc1 Wd1 Be1 Wf1 Bg1 Wh1 Ak We2kwadratyň e2 belgili bolandygyny aňladýar.

Iki ölçegli massiw ulanmagyň mysaly: matrisa köpeltmek

Üns beriň!Bu mysal matrisalaryň esasy bilimlerini talap edýär. Bu ýerde olar hakda gaty az aýdylar we bu maglumatlar matrisa arifmetikasyny öwrenen, ýöne birneme ýatdan çykaranlar üçin niýetlenendir. Şeýle-de bolsa, bu bilimleri açyk çeşmelerden, esasanam Wikipediýadaky makaladan alyp bolýar . Bu iki ölçegli massiwleri ulanmagyň gowy mysaly, ýöne biz onsuz dowam edip bileris. Şeýlelik bilen, indi matematiki nukdaýnazardan düşünip bolmajak ýaly görünýän bolsa we hakykatdanam içeri girmek islemeýän bolsaňyz, mysaldan geçip bilersiňiz. Esasy çyzykly algebrany öwrenen bolsaňyz, göniburçluk massiwleri gönüburçly matrisa hökmünde öwrenen bolmagyňyz mümkin. Köp ölçegli massiwler - 5Nirede a11, a12 ... aNN käbir sanlar. Suratda, matrisa hatda gönüburçly däl, kwadrat (hatarlaryň sany sütünleriň sanyna deňdir, ýöne bu mydama beýle däl). Hakyky durmuşda şeýle matrisalar seýrek duş gelýär, ýöne programmirlemekde we kompýuter biliminde olar gaty ýygy duş gelýär. Hususan-da, kompýuter grafikasynda we oýun dwigatellerinde ulanylýar. Mysal üçin, ekrandaky obýektiň islendik burça aýlanmagy, aýlaw matrisasy arkaly programmirläp bolýar. Iki ölçegli giňişlikde aýlanma matrisasy şeýle görünýär: Köp ölçegli massiwler - 6Teta obýektiň aýlanmaly burçy. Deň ölçegli matrisalar biri-birine goşulyp bilner we goşma element-element bolup biler (şol bir görkezijiler bilen elementleri goşýarys). Emma matrisa köpeltmegiň işi az tanalýar. Şeýlelik bilen, matrisalar köpeldilip bilner we netijede matrisa diňe birinji matrisanyň sütünleriniň sany ikinji hatar sanyna gabat gelýän ýagdaýynda alynyp bilner. Netije matrisasy birinji hatar bilen deň mukdarda we ikinji sütün bilen deň mukdarda bolar. Köpeltmek aşakdaky ýaly ýerine ýetirilýär. Geliň, matrisa a[l][m]we b[m][n]. Olaryň köpelmegi netijesinde matrisa almalydyrys c[l][n]. c[0][0]Önüm matrisasynyň elementini almak üçin a[0][0]birinji matrisanyň nol hatarynyň nol elementini ikinji matrisanyň nol elementi bilen köpeltmeli, soňra birinji matrisanyň birinji hatarynyň birinji elementini birinji element bilen köpeltmeli; ikinji matrisanyň birinji sütüninden we ş.m., şondan soň ähli önümler goşulýar.

a[0][0]*b[0][0] + a[0][1]*b[1][0] + … + a[0][m-1]*b[m-1][0]
Netije matrisasynyň birinji hatarynyň ikinji elementini almak üçin, ikinji hatar bilen şol bir prosedurany ýerine ýetirýäris

a[1][0]*b[0][0] + a[1][1]*b[0][1] + … + a[0][m-1]*b[m-1][0]
Çyzygyň soňuna çenli we ş.m. Soňra indiki setire geçýäris we setirlerimiz gutarýança prosedurany gaýtalaýarys. .Agny, birinji matrisanyň hatarlaryny ikinji matrisanyň sütünleri bilen köpeldýäris. Aşakda matrisa köpeltmegiň kody bar. Ony hatarlaryň we sütünleriň sanynda ýokarda görkezilen şerte laýyk gelýändigini barlamak bilen dolduryp bilersiňiz.
//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();
        }
Programma aşakdaky netijäni berýär: 1 2 3 1 1 1 0 0 0

Dörtburç däl iki ölçegli massiwler

Java-da iki ölçegli massiwler massiwler bolansoň, içki massiwleriň hersi dürli uzynlykda bolup biler. Bir massiw döredilende, sütünleriň sanyny däl-de, diňe hatarlaryň sanyny kesgitläp bileris (aslynda bu hatarlaryň uzynlygy). Bir mysala seredeliň.
//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();
        }
Programmanyň çykyşy: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 Şeýlelik bilen, massiwimiziň nol çyzgysy massiwi {1,2,3,4,5}, dördünji setirde bolsa massiw bar {1}.

Java-da üç ölçegli massiwler

Akyldar we Java diliniň logikasyna eýerip, üç ölçegli massiw “massiw massiwleri” ýa-da “her elementi iki ölçegli massiw” diýip atlandyryp bolar. Mundan başga-da, bu iki ölçegli massiwler dürli bolup biler. Mysal:
// 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];
Practiceöne köplenç iş ýüzünde üç ölçegli massiwler bolýar, onda üç mukdaryň hemmesi birbada kesgitlenýär, gönüburçly iki ölçegli massiwleriň analogy. Köp ölçegli massiwler - 7Öň hem belläp geçişimiz ýaly, üç ölçegli ýa-da has köp massiw seýrek ulanylýar. Şeýle-de bolsa, 3D massiw bilen gyzykly bir zady programma edip bilersiňiz. Mysal üçin, köp gatly awtoulag duralgasy. Her gat iki ölçegli massiw, awtoulag duralgasy bolsa üç ölçegli massiwiň aýratyn elementi hasaplanyp bilner. Şeýle massiwiň elementi, boş ýer boş bolsa we dogry bolsa, ýalňyşboolean bahasy bolan bir görnüş bilen görkezilip bilner.
//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 programmistiniň hakyky işinde köp ölçegli massiwler

Aslynda, Java döredijileriň köpüsi köp ölçegli massiwlere ýygy-ýygydan duş gelmeýärler. Şeýle-de bolsa, bu maglumatlar gurluşy gaty laýyk gelýän birnäçe meseleler bar.

  1. Synaglar we belli bir algoritmi barlamak üçin matrisalary yzygiderli düzmek üçin.
  2. Käwagt nerw ulgamlary üçin köp ölçegli massiwler ulanylýar.
  3. Köp ölçegli massiwler arhiwler üçin amatlydyr.
  4. Suratlar bilen işlemek.

Iki ölçegli we üç ölçegli massiwlerde gyzykly meseleler

Java-da köp ölçegli massiwler hakda ýeterlik bilýärsiňiz we özüňizi ynamly duýsaňyz, aşakdaky käbir meseleleri çözmäge synanyşyp bilersiňiz. Bu aňsat däl, ýöne gyzykly. Tic-tak-barmak. 3x3 meýdan guruň, nobatçy iki oýunçy dörediň. Ilki bilen meýdan boş, boş meýdanlaryň hersinde birinji oýunçy haç, ikinjisi nol goýup biler. Winnereňiji, bir hatarda, bir sütünde ýa-da diagonally tertipde üç haç ýa-da üç nol ýygnan adamdyr.

Başga näme okamaly

Täze başlanlar üçin Java oýny

Langtonyň garynjasy . Öýjüklere bölünen (iki ölçegli massiw), gara ýa-da ak reňklenen (tötänleýin funksiýa bilen kesgitlenip bilner) belli bir meýdan bar. “Garynja” öýjükleriň birinde tötänleýin emele gelýär we her ädimde keseligine ýa-da dikligine dört tarapyň birinde goňşy öýjüge hereket edip bilýär. Garynja hereketiniň düzgünleri:
  • Gara meýdançada garynja 90 ° çepe öwrülmeli, öýjüginiň reňkini ak reňkde üýtgetmeli, indiki meýdança öňe gitmeli.
  • Ak meýdançada garynja 90 ° sag tarapa öwrülýär we öýjüginiň reňkini gara reňkde üýtgedýär, soňra indiki meýdana tarap ädim ätýär.
nGarynjanyň başlangyç ýagdaýyny göz öňünde tutup, ädim belgisinde gaýtalanyşy hasaplaýan usul ýazyň . Meýdany tötänleýin nollar we harplar bilen dolduryp bolýar (ýa-da harplar bilen kesgitlenýär Wwe Bküşt tagtasynyň mysalynda edişimiz ýaly). Bize ýene iki parametr gerek - garynjanyň keseligine we dikligine, şeýle hem bu ädimdäki ugruna (demirgazyk, günorta, günbatar, gündogar), adaty ýagdaýda garynja demirgazyga seredýär. Üç ölçegli massiwleri ulanyp, Rubikiň kubyny modellemäge synanyşyp bilersiňiz. Adaty Rubik kubynyň 6 ýüzi bar we olaryň hersi reňkli kwadratlaryň üç ölçegli massiwidir Color[][][] rubik = new Color[6][3][3]. Şeýle-de bolsa, Rubigiň kubyny durmuşa geçirmek ownuk iş däl.

Toplumlar barada peýdaly materiallar

JavaRush-da köp makalalar massiwlere bagyşlanýar (esasanam bir ölçegli, sebäbi olar iş ýüzünde köplenç ulanylýar). Olara üns beriň.
  1. Java-daky massiwler - mysallar bilen başlaýanlar üçin massiwler hakda
  2. Toplumlar barada bir zat - massiwler barada gowy jikme-jik makala
  3. “Arrays” synpy we ulanylyşy - makalada synpyň käbir usullary beýan edilýärArray
  4. Toplumlar, massiwlere bagyşlanan ilkinji JavaRush leksiýasydyr.
  5. Nol uzynlykdaky massiwini yzyna gaýtaryň, täsirli däl - Netijeli programmirleme ýazyjysy Joşua Bloch boş massiwleri nädip has gowy yzyna gaýtarmalydygy barada gürleşýär
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION