CodeGym /Java-blogg /Tilfeldig /Noe om arrays
John Squirrels
Nivå
San Francisco

Noe om arrays

Publisert i gruppen
Hei! Tidligere i opplæringen din har vi jobbet med enkeltobjekter (og primitive typer). Men hva om vi trenger å jobbe med en hel gruppe objekter i stedet for bare ett? Si for eksempel at vi ønsker å lage en liste over bursdager til alle ansatte i selskapet vårt. Den skal inneholde 30 strenger formatert som følger: "Sarah Huffman, 25. januar" Vi vil dra nytte av en spesiell datastruktur kalt en array . Hvis vi sammenligner en matrise med et ekte objekt, ligner den veldig på et bankhvelv med bankbokser: Noe om matriser - 1En matrise består også av «bokser». Du kan legge noe (et element) i hver boks. For å få tilgang til et element, må du vite dets boksnummer (indeks). Slik lages en matrise:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Her lager vi en array som inneholder 10 elementer. Du kan umiddelbart legge merke til noen funksjoner i arrayet:
  1. Den lagrer elementer av en veldefinert datatype . Hvis vi lager en String-array, kan vi ikke lagre noe annet i den. Datatypen angis når matrisen opprettes . Det er her det skiller seg fra en bankboks (der en kunde kan lagre det han eller hun ønsker).

  2. Størrelsen må spesifiseres når matrisen opprettes . Du kan ikke indikere det senere eller endre størrelsen etter at matrisen er opprettet .
Det faktum at vi lager en matrise er indikert med firkantede parenteser på begge sider av uttrykket. De kan spesifiseres før eller etter navnet på referansevariabelen. Uansett vil det fungere:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Hvis du vil skrive noe inn i en matrise, må du spesifisere indeksen til boksen der verdien skal skrives. Boksene i en matrise er nummerert fra 0. Å telle fra null er en veldig vanlig praksis i programmering. Jo raskere du blir vant til det, desto bedre :) Noe om matriser - 2 Dette betyr at hvis du vil sette litt verdi i den første boksen , gjør du dette:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Nå er Janas bursdag lagret i den første cellen i vårt utvalg av ansattes bursdager: Du kan legge til andre verdier på lignende måte:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Merk at vi har lagt til Rosies bursdag i den åttende boksen (du har ikke glemt hvorfor boks nr. 7 er den åttende boksen, har du?) . Du kan se at vi ikke har fylt alle de andre cellene. Vi trenger ikke å skrive verdier i en matrise i rekkefølge. Det er ikke noe slikt krav. Å skrive elementer i rekkefølge gjør det selvfølgelig mye lettere å holde styr på hvor mange bokser som er ledige og hvor mange som er opptatt, og det forhindrer at arrayet har "hull". Hvis du ønsker å få innholdet i en av boksene, må du (akkurat som med en safe) vite nummeret. Slik gjøres det:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Konsollutgang: Rosie Mills, 3. januar Vi opprettet en Stringvariabel og fortalte kompilatoren: "Finn boksen med indeks 7 i bursdagsarrayet , og tilordne verdien som finnes der til variabelen StringrosieBirthday " . Og det var akkurat det den gjorde. Når vi jobber med matriser, kan vi enkelt finne lengden ved hjelp av en spesiell egenskap: lengde .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Konsollutgang: 10 Merk: lengthEgenskapen lagrer matrisestørrelsen, ikke antallet bokser som er fulle. Arrayet vårt lagrer bare 3 verdier, men vi anga størrelsen som 10 da vi opprettet det. Og det er akkurat denne verdien som lengthfeltet returnerer. Hvorfor skulle dette komme til nytte? Vel, anta at du vil vise en liste over alle bursdagene (for å bekrefte at ingen er glemt). Du kan gjøre dette i en enkel sløyfe:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
I loopen erklærer vi variabelen i, som initialiseres til null. Ved hvert pass får vi elementet med indeks i fra matrisen vår og viser verdien. Sløyfen vil gjøre 10 iterasjoner, og i vil øke fra 0 til 9 – og tall er tilfeldigvis indeksene til elementene i matrisen vår! Som et resultat vil vi vise alle verdier fra bursdager[0] til fødselsdager[9] Faktisk er det en annen måte du kan lage en matrise på. Du kan for eksempel lage en rekke ints som dette:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Denne teknikken kalles "snarveisinitialisering". Det er ganske praktisk, fordi vi samtidig lager en matrise og fyller den med verdier. Vi trenger ikke å spesifisere matrisestørrelsen eksplisitt: med snarveiinitialisering lengthsettes feltet automatisk.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Konsollutgang: 9 Nå, litt om hvordan arrays lagres i minnet. La oss si at vi har en rekke med tre Catobjekter:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Du må forstå et par ting her:
  1. Når det gjelder primitiver, lagrer en matrise et sett med spesifikke verdier (f.eks. ints). Når det gjelder objekter, lagrer en matrise et sett med referanser .
    Matrisen catsbestår av tre elementer, som hver er en referanse til et Catobjekt. Hver av referansene peker til minneadressen der det tilsvarende objektet er lagret.

  2. Array-elementer er ordnet i en enkelt blokk i minnet. Dette gjøres for å gjøre det mulig å få tilgang til dem raskt og effektivt.
Refererer således catstil minneblokken der alle objektene (array-elementer) er lagret. Cats[0]refererer til en spesifikk adresse i denne blokken. Noe om matriser - 3 Det er viktig å forstå at en matrise ikke bare lagrer objekter: det er et objekt i seg selv. Dette får oss til å stille spørsmål om vi ikke bare kan lage en rekke av strenger eller tall, men også en rekke matriser . Og svaret er ja, det kan vi! En matrise kan lagre alle objekter, inkludert andre matriser. En slik matrise kalles todimensjonal . Hvis vi skulle representert det visuelt, vil det være veldig likt et vanlig bord. Anta at vi ønsker å lage en matrise med 3 matriser som hver kan lagre 10 ints. Det ville sett slik ut:
Noe om matriser - 4
Hver linje representerer en intmatrise. Den første matrisen inneholder tall fra 1 til 10, den andre matrisen - fra -1 til -10, og den tredje - et sett med tilfeldige tall. Hver av disse arrayene er lagret i boksene til vår todimensjonale array. I kode ser initialisering av en todimensjonal matrise slik ut:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Våre todimensjonale array- katter lagrer 3 arrays med 5 bokser i hver array. Hvis vi ønsker å sette et objekt i den tredje boksen i den andre matrisen, vil vi gjøre dette:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]indikerer den andre matrisen, og [2]indikerer den tredje boksen i den matrisen. Fordi en todimensjonal matrise består av flere matriser, for å iterere gjennom den og vise alle verdiene (eller fylle ut alle dens elementer), trenger vi en nestet løkke:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
I den ytre sløyfen (variabel i) itererer vi over alle arrayene i vår todimensjonale array. I den indre løkken (variabel j) passerer vi gjennom alle elementene i hver matrise. Som et resultat vil cats[0][0] (første array, første element) vises først, etterfulgt av cats[0][1] (første array, andre element). Etter at vi har gått gjennom den første matrisen, vil vi vise katter[1][0] , katter[1][1] , katter[1][2] osv. Todimensjonale matriser støtter forresten også stenografi initialisering:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Vanligvis vil vi erklære den todimensjonale matrisen numberssom en int[3][3], men denne stenografien lar oss spesifisere verdiene umiddelbart. Hvorfor trenger du en todimensjonal matrise? Vel, du kan bruke en til enkelt å gjenskape det berømte «Battleship»-spillet: Noe om matriser - 5 I «Battleship» kan strukturen til spillefeltet beskrives enkelt: en todimensjonal matrise med 10 matriser med 10 elementer hver. Du lager to av disse matrisene (en for deg og en for motstanderen din)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
bruk noen verdier (f.eks. tall eller symboler) for å fylle ut elementene som tilsvarer plasseringen av skipene dine, og byt på å kalle ut koordinatene for spesifikke elementer:
  • slagskipBoard1[0][2]!
  • Gå glipp av! battleshipBoard2[2][4]!
  • Truffet!
  • battleshipBoard2[2][5]!
  • Truffet!
  • battleshipBoard2[2][6]!,
  • Senket!
Dette avslutter vår første introduksjon av arrays, men det er bare begynnelsen på vår interaksjon med dem. I de følgende leksjonene vil vi se interessante måter de kan brukes på, og også lære hvilke innebygde funksjoner Java har for å la oss jobbe mer praktisk med denne datastrukturen :)
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION