12 Flerdimensionella arrayer

En array (ett fält) i en dimension har vi sett tidigare. Syntaxen ser ut såhär

int[] a = new int[10];

och vi kan visualisera arrayen på detta vis:

Endimensionell array av typen heltal.

Om vi istället går över till två dimensioner så kan vi använda liknande syntax men med några förändringar. En tvådimensionell array med storleken 5x3 (av typen heltal) skapar vi med

int[,] b = new int[5,3];

Ett kommatecken mellan de första hakparanteserna anger att det är fråga om två dimensioner. I den andra hakparantesen anger första siffra storleken på första dimensionen (bredden) och andra siffran storleken på andra dimensionen (höjden). Vi kan tänka oss den tvådimensionella arrayen som en matris.

Tvådimensionell array av typen heltal.

För att komma åt ett visst element (för att t.ex. läsa av eller ändra ett värde) måste vi ange två positioner (koordinater).

b[3,1] = 5;

En tvådimensionell array har alltså två siffror för sitt index. Båda räknar fortfarande från 0, dvs. i arrayen b som vi deklarerade ovan så finns index 0-4 i ena dimensionen och 0-2 i den andra.

Om storleken på en flerdimensionell array är okänd kan vi ta reda på den genom GetLength() (inte bara Length) och i parantesen ange ordningsnumret på den dimension man vill undersöka. Dessa nummer börjar också räknas från 0, precis som index. Om vi t.ex. ska loopa igenom matrisen b och stoppa in slumpade tal mellan 1 och 100 på varje position kan vi göra såhär:

int[,] b = new int[5,3];
Random slump = new Random();
for (int i = 0; i < b.GetLength(0); i++)
{
    for (int j = 0; j < b.GetLength(1); j++)
    {
        b[i,j] = slump.Next(1, 101);
    }
}

12.1 Array av arrayer

Det gäller att inte blanda ihop flerdimensionell array med arrayer av arrayer. Om vi t.ex. har en sträng s

string s = "En apa och en katt, vilken underbar skatt!";

och sedan kör Split på den

string[] c = s.Split();

så kan vi inte komma åt första bokstaven i första ordet med c[0,0] utan måste ta till c[0][0]. Vi kan tänka oss att strängarrayen c (med dess char-arrayer) ser ut såhär:

Array av arrayer.

Med andra ord gäller det att “den andra dimensionen” är olika stor för olika positioner i den första dimensionen, något som inte är sant för en matris.

Array av arrayer vs. matris

12.2 Initialisera flerdimensionell array

Om vi vill tilldela värdet till en flerdimensionell array direkt vid deklaration gäller det att sätta måsvingarna {} på rätt plats. Om en 3x3-matris ska fyllas med talen 1-9 kan det se ut såhär:

int[,] d =
{
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

Med andra ord är det en upprepning av hur vi gör för att fylla en endimensionell array med ett par extra måsvingar som start och slut.

12.3 Ytterligare dimensioner

Om vi vill ha fler dimensioner är det bara att lägga till fler kommatecken i vår syntax! En tredimensionell array kan t.ex. skapas med

int[,,] e = new int[3,4,5];

Och vi kan då tänka oss att strukturen ser ut ungefär såhär:

Array med tre dimensioner.

För att komma åt storleken (om den skulle vara okänd) på den tredje dimensionen får vi i så fall använda oss av e.GetLength(2).

12.4 Övningar

  1. Skapa följande matris. Summera sedan samtliga tal och skriv ut till skärmen.

    int[,] tal =
    {
        { 3, 3, 9, 4, 3 },
        { 5, 2, 1, 9, 8 },
        { 6, 1, 8, 6, 7 },
        { 5, 9, 5, 4, 8 },
        { 4, 5, 1, 8, 8 }
    };
  2. Återanvänd datan ifrån uppgift 33 men beräkna nu istället summan kolumn för kolumn och skriv ut till skärmen. Med andra ord ska du skriva ut fem olika summor.

  3. Skapa en 3x3-matris av typen bool. Sätt in värdet true på två godtyckliga ställen och false på resten. Låt sedan användaren “spela” genom att skriva in koordinater och gissa var true-värdena finns. Skriv ut antal gissningar som krävdes och avsluta programmet när båda värdena har hittats.

  4. I matrisen nedan betecknas levande cell med * och död cell med mellanslag. Skriv ett program som beräknar vilken cell som har flest levande grannar. En cell kan maximalt ha 8 grannar.

    char[,] celler =
    {
        { ' ', '*', ' ', ' ', ' ', '*', ' ', ' ', ' ', '*' },
        { ' ', '*', ' ', ' ', ' ', ' ', '*', ' ', ' ', '*' },
        { '*', '*', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ' },
        { ' ', ' ', '*', '*', '*', '*', ' ', ' ', '*', ' ' },
        { ' ', '*', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ' },
        { ' ', '*', '*', ' ', '*', ' ', ' ', ' ', '*', ' ' },
        { '*', '*', '*', ' ', ' ', ' ', '*', ' ', ' ', '*' },
        { '*', '*', ' ', '*', ' ', ' ', ' ', '*', ' ', ' ' },
        { ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ' },
        { ' ', '*', ' ', ' ', ' ', '*', '*', '*', ' ', ' ' },
    };
  5. Utöka ditt program från uppgift 36 och lägg till så att levande celler slumpas på exakt 30 celler. Få programmet att skriva ut matrisen i konsollen och sedan beräkna samt skriva ut hur många grannar cellen med flest grannar har (inklusive cellens koordinater).