Listor (Arrays)

Listor är en typ av variabler (datatyp) som kan innehålla flera bitar av information (element) i en viss ordning.

Alla block som handlar om listor finns i kategorin Listor, som är gömd under Avancerat. Det finns två varianter på blocket som skapar en lista: en som börjar med en siffra, och en som börjar med två strängar. Spara listan i en variabel.

Länk till koden.

Med hjälp av blåa kugghjulsikonen kan du ändra hur många värden du vill skapa listan med. Genom att ta bort värden kan du även skapa en tom lista. Om du skapar en lista med fler värden, kan du hitta sträng-blocket () i Text kategorin, och siffra-blocket () i Matematik.

I JavaScript skapar man en lista med hakparenteser. Mellan dessa lägger man alla värden, separerat med en komma. När en variabel definieras som ska innehålla en lista måste det angivas vilken typ av data som listan kommer innehålla.

let mätvärden: number[] = []
let gruppstorlek: number[] = []
let inköpslista: string[] = []
inköpslista = ["broccoli", "banan"]
gruppstorlek = [25, 27]
mätvärden = []

Vad finns i listan?

Allt som ligger i en lista ligger i en ordning. Detta hålls reda på genom att varje element har en siffra, börjande på 0, vilket kallas för index.

inköpslista

indexelement
0broccoli
1banan
2kiwi
3tandborste
4olivolja

Om vi vill hämta information från listan används index för att välja vilket värde vi vill läsa ut. Eftersom det första elementet har index 0, har det sista elementet index lika med längden på listan minus 1. Så i exemplet nedan ger knapp A ”Kiwi”, och knapp B ”Olivolja”. Om man skulle fråga om ett värde ur en lista med en index som inte finns, får man i dom flesta programspråk ett felmeddelande. Micro:bit gör inte det men ger värdet 0 som resultat.

let inköpslista: string[] = []
inköpslista = ["broccoli", "banan", "kiwi", "tandborste", "olivolja"]
input.onButtonPressed(Button.A, () => {
 basic.showString(inköpslista[2])
})
input.onButtonPressed(Button.B, () => {
 basic.showString(inköpslista[inköpslista.length - 1])
})

Länk till koden.

Med hjälp av index kan vi också ändra på ett värde som finns i listan. Till exempel om vi upptäcker att vi har skrivit fel grönsak på inköpslistan:

input.onButtonPressed(Button.AB, () => {
  inköpslista[0] = "majs"
})

Länk till koden.

Fylla på

Vi kan lägga till nya saker i en lista utan problem. Längden på listan ökar då. Om nya värdet infogas i början, eller någonstans mellan element, betyder det att index kommer flyttas på också. Om vi skulle foga in ett värde på index 1 i vår inköpslista, skulle det se ut så här. Banan och allt som följer efter flyttas till ett index högre, och kaffe tar upp platsen på index 1.

input.onButtonPressed(Button.AB, () => {
 inköpslista.insertAt(1, "kaffe")
})

Länk till koden.

inköpslista

indexelement
0broccoli
1kaffe
2banan
3kiwi
4tandborste
5olivolja

Här är ett annat exempel som samlar in temperaturmätvärden varje 5 sekunder. Listan börjar tom, och nya värden läggs till i slutet.

let mätvärden: number[] = []
mätvärden = []
basic.forever(() => {
 mätvärden.push(input.temperature())
 basic.pause(5000)
})

Länk till koden.

Gå igenom allt

Ofta när man har en lista med många element vill man göra något med varje element. Då är det ett perfekt tillfälle för en loop. Här kan vi använda index för att hämta ett annat element varje iteration av loopen. Följande exempel går igenom alla mätvärden och visar dom snabbt som en graf när man trycker på A-knappen.

let mätvärden: number[] = []
mätvärden = []
input.onButtonPressed(Button.A, () => {
 for (let plats = 0; plats <= mätvärden.length - 1; plats++) {
   led.plotBarGraph(
     mätvärden[plats],
     40
   )
 }
 basic.clearScreen()
})
basic.forever(() => {
 mätvärden.push(input.temperature())
   basic.pause(5000)
})

Länk till koden.

Men eftersom det är så vanligt att göra den här typen av loop som går igenom alla element i en lista, finns det en special version som gör det lite smidigare. Den ser ut så här. Stora skillnaden är att vi nu direkt får värden som finns i listan, istället för att få index och använda den för att plocka ut värden.

input.onButtonPressed(Button.A, () => {
 for (let värde of mätvärden) {
   led.plotBarGraph(
     värde,
     40
   )
 }
 basic.clearScreen()
})

Länk till koden.

Senast ändrad 2018-03-27