[] Arrayer = Indexerad variabel Lagra många värden i en variabel Jmfr inom matematiken, variabler x 0, x 1, x 2, I detta dokument tas upp hur man skapar och hanterar sådana variabler i java. Dessa kallas för arrayer. Arrayer med ett index 1
Arrayer med ett index Skapa en array med 5 st värden int [] tal = { 3, 7, 8, 1, 6}; Så här ser det ut i minnet: tal 0 1 2 3 4 3 7 8 1 6 Variabeln tal innehåller en referens till minnet där de 5 värdena är lagrade Arrayer med ett index 2
Nu finns det 5 st int-variabler som man kommer åt via ett index: tal[0],tal[1],tal[2],tal[3],tal[4] Vi kallar dem för element. Elementen har index 0-4 Variabeln tal består av 5 st element. Arrayer med ett index 3
Längden på en array En array vet alltid om sin längd. Mha variabeln length får man veta längden. Arrayen tal har längden tal.length Arrayen tal har index 0-tal.length-1 Arrayer med ett index 4
Utskrift av elementen i en array Måste skriva ut ett element i taget // Loopa i=0..4 for (int i=0; i<=4; i++) { System.out.println(tal[i]); } Bättre med length for (int i=0; i<tal.length; i++) { System.out.println(tal[i]); } Arrayer med ett index 5
Det går ej att skriva ut så här Vi skriver ut värdet av arrayvariabeln System.out.println(tal); Utskriften blir så här: [I@7f3b8a [I betyder att det är en array av heltal @7f3b8a är värdet på referensen Vilket beror på arrayvariabeln är en referens Arrayer med ett index 6
Håll reda på index En array har index från 0 till och med length-1 Försöker man använda fel index, blir det fel av typen index är utanför gränserna Antingen upptäcker kompilatorn det eller så blir det fel när programmet körs och felmeddelandet: ArrayIndexOutOfBoundsException 5 Vilket betyder att vi försöker använda det felaktiga indexvärdet 5 Arrayer med ett index 7
Vi läser in nya värden till arrayen via tangentbordet För inmatning via tangentbordet måste vi först göra följande saker: Överst i klassen skriver vi: import java.util.scanner; I den metod där inmatningen skall ske skriver vi: Scanner input = new Scanner(System.in); Arrayer med ett index 8
Vi läser in nya värden till arrayen via tangentbordet System.out.println("Ge " + tal.length + " tal:"); for (int i=0; i<tal.length; i++) { } System.out.print("Ge tal " + i + ":"); // Värdena lagras på index 0 4 tal[i] = input.nextint(); Arrayer med ett index 9
Aritmetik på arrayer Aritmetik kan utföras på de enskilda elementen Exempel: // Summera talen double sum=0; for (int i=0; i<tal.length; i++) { sum = sum + tal[i]; } // Exempel annan aritmetik tal[1]++; tal[3]=tal[0]+tal[2]; Arrayer med ett index 10
Deklarera en array med nollställda värden En array med tio heltals-element, alla värden initieras till noll: int [] tal = new int [10]; Med new reserveras minnesutrymme för arrayens tio element. Jmfr med Dice d = new Dice(7); där det reserveras minnesutrymme för ett Dice-objekt. Stoppa in några värden i arrayen: tal[0]=4; tal[1]=88; Arrayer med ett index 11
Bestämma arrayens längd med variabel System.out.println("Antal tal?"); int antal = input.nextint(); // Användarens svar bestämmer arrayens längd // Skapa en array med längden antal int [] tal = new int[antal]; System.out.println("Ge talen:"); for (int i=0; i<tal.length; i++) { tal[i] = input.nextint(); } Arrayer med ett index 12
Utöka en array Antag att vi önskar en array x som automatiskt anpassar sig till hur många värden som man lagrar i den. Om t.ex. arrayen x är så här: int [] x = {10, -1, 7, 890, 5}; x 0 1 2 3 4 10-1 7 890 5 Nu önskar vi lägga till nytt tal (t.ex. 14) sist i arrayen, men det får ju inte plats. Ett sätt att lösa det beskrivs av följande steg: 1. Skapa en array slask som är ett element längre än x int [] slask = new int[x.length+1]; slask 0 1 2 3 4 0 0 0 0 0 0 5 Fortsättning Arrayer med ett index 13
(*) fortsättning ex. utöka array löpande 2. Kopiera alla element från x till slask for (int i=0; i<x.length; i++) { slask[i] = x[i]; } slask 0 1 2 3 4 10-1 7 890 5 0 5 3. Lagra det nya talet (14) sist i arrayen: slask[slask.length-1] = 14; slask 0 1 2 3 4 10-1 7 890 5 14 5 Fortsättning Arrayer med ett index 14
(*) fortsättning ex. utöka array löpande 4. Sätt x att referera till samma array som slask: x=slask; x slask 0 1 2 3 4 10-1 7 890 5 14 5 5. Sätt slask att referera till null, dvs ingen array. slask=null; Därmed har arrayen x utökats med ett element x slask null 0 1 2 3 4 10-1 7 890 5 14 5 Arrayer med ett index 15
Oinitierade arrayer Ett array kan vara deklarerad men oinitierad, referensen är då null: int [] tal; Variabeln refererar inte till något innehåll System.out.println(tal); tal Ger utskriften: null null Arrayen kan initieras med: tal = new int[5]; Referensen blir då inte null. Alla element får värdet noll. tal 0 0 0 0 0 Arrayer med ett index 16
Ex: Lagra om värdena i omvänd ordning int [] x = {10, -1, 7, 890, 5}; // temp blir lika lång som x int [] temp = new int[x.length]; // kopiera från x i omvänd ordning for (int i=0; i<x.length; i++) { temp[i] = x[x.length-i-1]; // Notera! } // temp är nu 5,890,7,-1,10 // Vad händer om vi gör följande? x = temp; // x blir 5, 890, 7, -1, 10 // x och temp refererar till samma innehåll // referensen tappas till 10,-1,7,890,5 Arrayer med ett index 17
Arrayer av andra datatyper än int Exempel double-array Skapa en array med 3 st slumptal double [] s = {10*Math.random(), 10*Math.random(), 10*Math.random() }; 20 nollställda element double [] t = new double[20]; Exempel boolean-array: boolean [] ledigplats = {false, false, false, false}; Arrayer med ett index 18
Övning: Analys av aktiekurs Kursen är lagrad i en array för dag 1 till dag 10: double [] kurs = {8.5, 8.6, 8.9, 9.6, 9.7, 9.7, 9.5, 9.1, 9.0, 9.2}; Skriv ett program som beräknar hur många dagar som kursen steg respektive sjönk under de tio dagarna. Beräkna även den största kursändringen i procent från en dag till nästa och vilken dag det var. Arrayer med ett index 19
Övning: Slumpa ut värden från en lista I ett lotteri drar man vinnare baserat på sexsiffriga födelsedata (ååååmmdd). Antag att de födelsedata som finns med i ett lotteri är lagrade i en array: int [] födelsedata = {19900101, 19900526, 19910706, 19890719, 19900715, 19900226, 19700917}; Skriv ett program som slumpar ut det födelsedata som vinner. Att fundera på: Hur skall man slumpa ut ett värde från arrayen? Tips: Försök utnyttja index i arrayen Extra uppgift, slumpa även ut de födelsedata som får 2:a priset och 3:e priset. Tänk på att samma födelsedata ej kan vinna flera ggr. Arrayer med ett index 20
Övning*: Beräkning av frekvens mha array (denna övning kan göras på egen hand) Antag att vi vet åldern för medlemmarna i förening och det skall presenteras som en åldersfördelning. Antal ålder Vi behöver då en räknare för varje ålder som kan förekomma. Detta kan lösas fiffigt mha av en array Övningen fortsätter nästa blad Arrayer med ett index 21
Antag Åldern för medlemmarna i en förening finns lagrade i en array int [] ålder={22,18,17,22,17,19,17,19,24,20}; Vi önskar beräkna en åldersfördelning, dvs så här: Ålder Beräkning av frekvens forts.. Antal 17 3 18 1 19 20 2 1 21 0 22 23 2 0 24 1 Idé: Vi skapar en array vars index betyder ålder int [] antal = new [100]; // ålder 0-99 Alla element är noll initialt. Övningen fortsätter nästa blad Arrayer med ett index 22
Beräkning av frekvens forts.. Elementen i antal skall fungera som räknare för respektive ålder 0-99. Exvis antal[16] är en räknare för åldern 17. Alla räknare är nollställda från början. Loopa igenom arrayen ålder int aktuell_ålder; for (int i=0; i<ålder.length; i++) { aktuell_ålder = ålder[i]; // använd nu aktuell_ålder som index antal[aktuell_ålder]++; // öka med 1 } Skriv ut frekvensen, dvs elementen i arrayen antal for (int i=0; i<antal.length; i++) { // Skriv ut ålder och antal i två kolumner System.out.println((i+1) + " " + antal[i]); } Övningen fortsätter nästa blad Arrayer med ett index 23
Beräkning av frekvens forts.. Skriv ett program som beräknar och skriver ut åldersfördelningen för värdena som finns i arrayen ålder. Bygg sedan på programmet så att det skriver ut en kolumn till, nämligen antalet i procent. Arrayer med ett index 24
namn Arrayer av String Exempel, en array med fyra element String [] namn = {"Uno", "Eva", "Pia", "Bo"}; Så här kan det se ut minnet: 0 1 2 3 B o P i a E v a U n o namn är en referens till minnet där arrayens fyra element är lagrade. Dessa element är i sin tur referenser till där respektive sträng är lagrad. T.ex. är namn[0] en referens till minnet där strängen med tecknen "Uno" är lagrade. Arrayer med ett index 25
Skriv ut alla strängarna i arrayen namn: for (int i=0; i<namn.length; i++) { System.out.println(namn[i]); } Byt värde på element: namn[2]= "Elvina"; Gör om alla gemener till versaler för index 2 namn[2] = namn[2].touppercase(); Beräkna antal tecken (längden) för namn[2] int längd = namn[2].length(); Ger värdet 6 length() är en metod i klassen String Arrayer med ett index 26
Läs in ny sträng via tangentbordet System.out.println("Ge värde för index 2:"); namn[2]=input.nextline(); Läs in nya strängar i alla elementen for (int i=0; i<namn.length; i++) { System.out.println("Ge värde för index " + i + ":"); namn[i]=input.nextline(); } Arrayer med ett index 27
Ex: Skapa ett namnregister med kapacitet för 100 st namn. Läs in namn och lagra i registret tills man svarar EXIT. String [] reg = new String[100]; //Registret antal=0; // antal inlästa namn String namn; // Loopa så länge det finns plats i registret while ( antal<100) { System.out.println("Ge namn:"); namn =input.nextline(); // Om det inlästa är EXIT, bryt loopen if (namn.equals("exit")) { break; } reg[antal]=namn; // Lagra i arrayen antal++; } Arrayer med ett index 28