CodeGym /Java blogg /Slumpmässig /Något om arrayer
John Squirrels
Nivå
San Francisco

Något om arrayer

Publicerad i gruppen
Hej! Tidigare i din utbildning har vi arbetat med enskilda objekt (och primitiva typer). Men vad händer om vi behöver arbeta med en hel grupp av objekt istället för bara ett? Säg till exempel att vi vill skapa en lista över födelsedagar för alla anställda på vårt företag. Den bör innehålla 30 strängar formaterade enligt följande: "Sarah Huffman, 25 januari" Vi kommer att dra nytta av en speciell datastruktur som kallas en array . Om vi ​​jämför en array med ett verkligt objekt så är det väldigt likt ett bankvalv med bankfack: Något om arrayer - 1En array består också av "boxar". Du kan lägga något (ett element) i varje låda. För att komma åt ett element måste du känna till dess boxnummer (index). Så här skapas en array:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Här skapar vi en array som rymmer 10 element. Du kan omedelbart notera några funktioner i arrayen:
  1. Den lagrar element av en väldefinierad datatyp . Om vi ​​skapar en String-array kan vi inte lagra något annat i den. Datatypen anges när arrayen skapas . Det är här det skiljer sig från ett värdeskåp (i vilket en kund kan lagra vad han eller hon vill ha).

  2. Dess storlek måste anges när arrayen skapas . Du kan inte ange det senare eller ändra dess storlek efter att arrayen har skapats .
Det faktum att vi skapar en array indikeras med hakparenteser på båda sidor av uttrycket. De kan anges före eller efter namnet på referensvariabeln. Oavsett vilket kommer att fungera:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Om du vill skriva något i en array måste du ange indexet för rutan där värdet ska skrivas. Rutorna i en array är numrerade från 0. Att räkna från noll är en mycket vanlig praxis inom programmering. Ju snabbare du vänjer dig, desto bättre :) Något om arrayer - 2 Det betyder att om du vill lägga något värde i den första rutan , gör du så här:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Nu lagras Janas födelsedag i den första cellen i vårt utbud av anställdas födelsedagar: Du kan lägga till andra värden på liknande sätt:

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";
   }
}
Observera att vi lade till Rosies födelsedag i den åttonde rutan (du har inte glömt varför låda nr 7 är den åttonde lådan, eller hur?) . Du kan se att vi inte har fyllt alla andra celler. Vi behöver inte skriva värden i en array i ordning. Det finns inget sådant krav. Att skriva element i ordning gör det förstås mycket lättare att hålla reda på hur många lådor som är lediga och hur många som är upptagna, och det förhindrar att arrayen har "hål". Om du vill få innehållet i en av lådorna måste du (precis som med ett värdeskåp) veta dess nummer. Så här går det till:

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);
   }
}
Konsolutdata: Rosie Mills, 3 januari Vi skapade en Stringvariabel och sa till kompilatorn: "Hitta rutan med index 7 i födelsedagsarrayen och tilldela värdet som finns där till variabeln StringrosieBirthday " . Och det var precis vad det gjorde. När vi arbetar med arrayer kan vi enkelt hitta deras längd med hjälp av en speciell egenskap: length .

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);
   }
}
Konsolutdata: 10 Obs: lengthEgenskapen lagrar arraystorleken, inte antalet rutor som är fulla. Vår array lagrar bara 3 värden, men vi angav dess storlek som 10 när vi skapade den. Och det är just detta värde som lengthfältet returnerar. Varför skulle detta vara användbart? Tja, anta att du vill visa en lista över alla födelsedagar (för att verifiera att ingen är glömd). Du kan göra detta i en enkel slinga:

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 deklarerar vi variabeln , isom initieras till noll. Vid varje pass får vi elementet med index i från vår array och visar dess värde. Slingan kommer att göra 10 iterationer, och i kommer att öka från 0 till 9—och siffror råkar vara indexen för elementen i vår array! Som ett resultat kommer vi att visa alla värden från födelsedagar[0] till födelsedagar[9] Det finns faktiskt ett annat sätt att skapa en array. Du kan till exempel skapa en array av ints så här:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Denna teknik kallas "genvägsinitiering". Det är ganska bekvämt, eftersom vi samtidigt skapar en array och fyller den med värden. Vi behöver inte uttryckligen ange arraystorleken: med genvägsinitiering lengthställs fältet in automatiskt.

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);
   }
}
Konsolutgång: 9 Nu lite om hur arrayer lagras i minnet. Låt oss säga att vi har en uppsättning av tre Catobjekt:

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åste förstå några saker här:
  1. I fallet med primitiver lagrar en array en uppsättning specifika värden (t.ex. ints). När det gäller objekt lagrar en array en uppsättning referenser .
    Arrayen catsbestår av tre element, som var och en är en referens till ett Catobjekt. Var och en av referenserna pekar på minnesadressen där motsvarande objekt är lagrat.

  2. Arrayelement är ordnade i ett enda block i minnet. Detta görs för att de ska kunna nås snabbt och effektivt.
Refererar alltså catstill minnesblocket där alla objekt (arrayelement) är lagrade. Cats[0]refererar till en specifik adress inom detta block. Något om arrayer - 3 Det är viktigt att förstå att en array inte bara lagrar objekt: det är ett objekt i sig. Detta får oss att ifrågasätta om vi inte bara kan skapa en array av strängar eller siffror, utan också arrayer av arrayer . Och svaret är ja, det kan vi! En array kan lagra alla objekt, inklusive andra arrayer. En sådan array kallas tvådimensionell . Om vi ​​skulle representera det visuellt kommer det att vara väldigt likt ett vanligt bord. Anta att vi vill skapa en array med 3 arrayer som varje kan lagra 10 ints. Det skulle se ut så här:
Något om arrayer - 4
Varje rad representerar en intarray. Den första matrisen innehåller siffror från 1 till 10, den andra matrisen - från -1 till -10, och den tredje - en uppsättning slumptal. Var och en av dessa arrayer lagras i lådorna i vår tvådimensionella array. I kod ser initialiseringen av en tvådimensionell array ut så här:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Våra tvådimensionella array- katter lagrar 3 arrayer med 5 lådor i varje array. Om vi ​​vill lägga ett objekt i den tredje rutan i den andra arrayen, skulle vi göra så här:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]indikerar den andra matrisen och [2]indikerar den tredje rutan i den matrisen. Eftersom en tvådimensionell array består av flera arrayer, för att kunna iterera genom den och visa alla dess värden (eller fylla i alla dess element), behöver vi en kapslad loop:

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 yttre slingan (variabel i) itererar vi över alla arrayer i vår tvådimensionella array. I den inre slingan (variabel j) passerar vi genom alla element i varje array. Som ett resultat kommer cats[0][0] (första array, första element) att visas först, följt av cats[0][1] (första array, andra element). Efter att vi har gått igenom den första arrayen kommer vi att visa cats[1][0] , cats[1][1] , cats[1][2] etc. Förresten, tvådimensionella arrayer stöder också stenografiinitiering:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Vanligtvis skulle vi deklarera den tvådimensionella matrisen numberssom en int[3][3], men denna stenografi låter oss specificera värdena omedelbart. Varför skulle du behöva en tvådimensionell array? Tja, du kan använda en för att enkelt återskapa det berömda "Battleship"-spelet: Något om arrayer - 5 I "Battleship" kan strukturen på spelplanen enkelt beskrivas: en tvådimensionell array med 10 arrayer med 10 element vardera. Du skapar två av dessa arrayer (en för dig och en för din motståndare)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
använd några värden (t.ex. siffror eller symboler) för att fylla i de element som motsvarar platsen för dina fartyg, och turas sedan om att ropa ut koordinaterna för specifika element:
  • battleshipBoard1[0][2]!
  • Fröken! battleshipBoard2[2][4]!
  • Träffa!
  • battleshipBoard2[2][5]!
  • Träffa!
  • battleshipBoard2[2][6]!,
  • Sänkt!
Detta avslutar vår första introduktion av arrayer, men det är bara början på vår interaktion med dem. I följande lektioner kommer vi att se intressanta sätt de kan användas, och även lära oss vilka inbyggda funktioner Java har för att låta oss arbeta med denna datastruktur mer bekvämt :)
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION