Arrayer (vektorer) Murach’s: kap 8 1 2013-01-15 © Elektronikcentrum i Svängsta AB Arrayer • Arrayer (vektorer) – Ofta i ett program har vi flera variabler av samma datatyp som är relaterade till varandra. – Exempel • Koordinater längs en sträcka mellan två punkter (tänk GPS med vägbeskrivning) • Namn på personer som är medlemmar i en klubb – Istället för att ha flera variabler kan vi använda oss av arrayer (även kallat vektorer). © EC Utbildning AB 2013-01-15 2 Arrayer • Arrayer (vektorer) – En array är en variabel som just består av en samlig relaterad data. – De har en definierad längd (storlek). När storleken bestämts går den ej att ändra. – Deklaration av en array består av flera delar: – dataType[] arrayName = new dataType[size]; dataType int, string, decimal etc.. Hakparenteser [] Visar att det är en array arrayName Namnet på arrayen (variabelnamet) new Minne för arrayen allokeras (arrayer är klasser i .NET) size Antal element som ryms i arrayen © EC Utbildning AB 2013-01-15 3 Arrayer • Arrayer (vektorer) – En vektor kan bestå av en eller flera dimensioner. – Oftast är dessa en- eller tvådimensionella. – Varje dimension kan bestå av ett eller flera element – Index börjar på 0 – • första elementet i arrayen ligger på plats 0. • Innehåller arrayen 3 element är således högsta index 2. – Man kommer åt ett element genom att ange dess index inom hakparenteser [ ] //Endimenstionell vektor med 3 element int[] oneDimArray = new int[3]; oneDimArray[0] = 1; //första elementet - alltid på plats 0 oneDimArray[1] = 2; oneDimArray[2] = 3; //sista elementet - alltid 1 mindre än storleken på arrayen //Tvådimensionell vektor med (2 x 3) 6 element double[,] multiArray = new double[2, 3]; multiArray[0, 0] = 1.0; //första elementet multiArray[1, 2] = 6.0; //sista elementet © EC Utbildning AB 2013-01-15 4 Arrayer • Endimensionella arrayer och initiering – Vanligast är att man arbetar med endimensionella vektorer. – Vet man vilka värden som ska finnas i arrayen kan man tilldela dessa direkt. Dessa anges inom måsvingar {} och separerade med komma, . //Initiering på två rader string[] names; //deklaration names = new string[2]; //tilldelning med storlek (2) // Initiering med värden. Storleken beräknas automatiskt int[] intArray = { 1, 2, 3, 4 }; // Initiera med storlek. Värdena nollställs decimal[] prices = new decimal[2]; prices[0] = 2.7m; prices[1] = 3.14m; © EC Utbildning AB //första elementet //andra (sista) elementet 2013-01-15 5 Arrayer • Endimensionella arrayer – Man kan tänka sig att en endimensionell array är som en lista. int[] array = {10, 9, 8, 7}; Index 0 1 2 3 Värde 10 9 8 7 array[1] = 6; array[3] = array[2]; Index 0 1 2 3 Värde 10 6 8 8 © EC Utbildning AB 2013-01-15 6 Arrayer • Tvådimensionella arrayer – Arbetar man med två dimensioner används kommatecknet (,) för att separera på dimensionerna. – Tvådimensionella arrayer kan visualiseras som en tabell där första dimensionen är raderna och andra dimensionen är kolumnerna. double[,] arrayName = new double[rows, columns]; © EC Utbildning AB 2013-01-15 7 Arrayer • Tvådimensionella arrayer – För att komma åt ett element i arrayen behöver vi här ange båda dimensionerna // Skapa arrayen int[,] myArray = new int[2, 3]; //Första raden myArray[0, 0] = 1; myArray[0, 1] = 2; myArray[0, 2] = 3; //Andra raden myArray[1, 0] = 4; myArray[1, 1] = 5; myArray[1, 2] = 6; © EC Utbildning AB 2013-01-15 8 Arrayer • Tvådimensionella arrayer Värden nollställs vid initiering Kolumn 0 1 2 0 0 0 0 0 0 0 1 2 Rad 0 1 // Skapa arrayen int[,] myArray = new int[2, 3]; Kolumn //Första raden myArray[0, 0] = 1; myArray[0, 1] = 2; myArray[0, 2] = 3; Rad 0 1 2 3 //Andra raden myArray[1, 0] = 4; myArray[1, 1] = 5; myArray[1, 2] = 6; 1 4 5 6 © EC Utbildning AB 2013-01-15 9 Arrayer • Tvådimensionella arrayer – Precis som med endimensionella arrayer kan tvådimensionella dito initieras med värden: // Initiera en 2 x 3-array med värden int[,] myArray = { { 1, 2, 3 }, //Rad 1 {4, 5, 6 } }; //Rad 2 © EC Utbildning AB 2013-01-15 10 Arrayer • Flerdimensionella arrayer – Vanligtvis arbetar man med en eller två dimensioner i sina arrayer. – Krävs fler än två dimensioner i din array är det samma tillvägagångssätt som med tvådimensionella arrayer – det kräver bara utökning av dimensionerna: int[, ,] threeD = new int[2, 4, 8]; © EC Utbildning AB 2013-01-15 11 Arbeta med arrayer 12 2013-01-15 © Elektronikcentrum i Svängsta AB Arbeta med arrayer • Arrayers storlek – När man hanterar arrayer är det viktigt att tänka på dess storlek. – Anger du en indexposition utanför arrayens gränser kommer programmet med all sannolikhet att krascha! int[] array = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3; // Skriver utanför arrayens gräns// IndexOutOfRangeException kommer genereras array[3] = 4; Index 0 1 2 ??? Värde 1 2 3 ??? © EC Utbildning AB 2013-01-15 13 Arbeta med arrayer • Arrayers storlek – För att ta reda på hur många element det finns i en array, eller specifik dimension i arrayen, finns följande metoder i tabellen nedan. – Dessa är speciellt användbara tillsammans med loopar då man på ett enkelt sätt kan stega genom alla element Metod/Property Beskrivning Length Returnerar ett heltal (integer) som representerar antalet element för alla dimensioner i arrayen. En 4x4-array returnerar då 16. OBS – returvärdet är antalet element i arrayen, inte det högsta indexvärdet! GetUpperBound(dim) Finn det största index-värdet i arrayen för vald dimension (skickas som parameter). Precis som vanligt index börjar man räkna på 0. © EC Utbildning AB 2013-01-15 14 Arbeta med arrayer • Arrayers storlek – Exempel //Några produkters priser decimal[] prices = {10.9m, 23m, 139m, 59.9m,74.5m}; decimal subTotal = 0.0m; Console.WriteLine("Antal element: {0}", prices.Length); Console.WriteLine("Högsta indexvärde: {0}", prices.GetUpperBound(0)); //Gå igenom alla element //Tänk på att Length alltid är 1 (ett) större än antalet element! for (int i = 0; i < prices.Length; i++) { subTotal += prices[i]; Console.WriteLine("index {0}:\t{1:c}", i, prices[i]); } Console.WriteLine("Slutsumma:\t{0:c}", subTotal); Console.ReadLine(); Antal element: 5 Högsta indexvärde: 4 index 0: 10,90 kr index 1: 23,00 kr index 2: 139,00 kr index 3: 59,90 kr index 4: 74,50 kr Slutsumma: 307,30 kr © EC Utbildning AB 2013-01-15 15 Arbeta med arrayer • Foreach – Att stega igenom en array (eller andra collections såsom List och Dictionary som förklaras senare) finns en dedikerad loop: foreach. foreach(dataType value in collection) { //gör någonting med value } © EC Utbildning AB 2013-01-15 16 Arbeta med arrayer • Foreach //Några produkter med priser decimal[] prices = { 10.9m, 23m, 139m, 59.9m, 74.5m }; decimal subTotal = 0.0m; //Gå igenom alla element foreach(decimal value in prices) { subTotal += value; Console.WriteLine("enhetspris:\t{0:c}", value); } Console.WriteLine("Slutsumma:\t{0:c}", subTotal); Console.ReadLine(); enhetspris: enhetspris: enhetspris: enhetspris: enhetspris: Slutsumma: © EC Utbildning AB 10,90 kr 23,00 kr 139,00 kr 59,90 kr 74,50 kr 307,30 kr 2013-01-15 17 Arbeta med arrayer • Foreach – Vissa begränsningar finns där man måste använda en vanlig for-loop: • Vi vill bara komma åt vissa element i samlingen, exempelvis element 10-15. Med foreach går vi igenom alla element. • Vi vill uppdatera elementen. Uppbyggnaden av foreach gör det omöjligt att uppdatera värdetyper. Man behöver en for-loop för detta ändamål. © EC Utbildning AB 2013-01-15 18 Arbeta med arrayer • Statiska metoder på arrayer – Det finns även två statiska metoder för array-klassen som är användbara. – Då dessa metoder är statiska anropas de direkt på Array-klassen. Metod Beskrivning Clear(myArray, index, length) Nollställer de specificerade värdena mellan index och length element framåt. IndexOf(myArray, value) och LastIndexOf(myArray, value) Finn första respektive sista index-värdet för det specificerade värdet. Om värdet inte kunde hittar returneras -1 © EC Utbildning AB 2013-01-15 19 Arbeta med arrayer • Statiska metoder på arrayer // En array med dimensionerna 4x2 int[,] myArray = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; //statisk method – anropas direkt på Array! Array.Clear(myArray, 1, 4); 1 2 3 4 5 6 7 8 Array.Clear(myArray, 1, 4); © EC Utbildning AB 1 0 0 0 0 6 7 8 2013-01-15 20 Collections (samlingar) Murach’s: kap 8 (från s. 232) 21 2013-01-15 © Elektronikcentrum i Svängsta AB Collections (samlingar) • Collections – En utökning av Arrayer är så kallade collections (samlingar). – Till skillnad från arrayer, som har en fast storlek, kan collections variera antalet element i sig. – Det är alltså möjligt att lägga till och ta bort element dynamiskt – samlingen utökas automatiskt när det behövs. © EC Utbildning AB 2013-01-15 22 Collections (samlingar) • Collections – De collectionklasser som man främst använder är generiska (eng. generic) – Detta betyder att man anger, direkt efter typnamnet och innanför vinkelparenteser (<>), vilken datatyp samlingen ska innehålla. – Man skriver ofta List<T> för att symbolisera att klassen är generisk. T står för Type. – En lista som innehåller int definieras såhär: List<int> myList = new List<int>(); © EC Utbildning AB 2013-01-15 23 Collections (samlingar) • Collections – De vanligaste collectionklasserna är: Klass Beskrivning List<T> Fungerar ungefär som en array – man kommer åt ett element via dess index. Dictionary<TKey,TValue> Liknar ett uppslagsverk – man använder ett nyckelord, TKey, för att komma åt ”definitionen” (alltså värdet), TValue. De kan vara av olika datatyper. Queue<T> En kö av typen FIFO (First In, First Out). Det som kommer först in i kön tas först ut. Stack<T> En stack (hög, stapel) av typen LIFO (Last In, First Out). Det som läggs överst på högen tas bort först. © EC Utbildning AB 2013-01-15 24 Collections (samlingar) • List<T> – Den absolut vanligaste samlingsklassen är List<T> då den är ett bra substitut för vanliga arrayer. – En List<T> kan alltså innehålla en datatyp – dock kan olika List<T> innehålla olika datatyper: List<int> myList = new List<int>(); List<string> names = new List<string>(); List<decimal> priceList = new List<decimal>(); © EC Utbildning AB 2013-01-15 25 Collections (samlingar) • List<T> – Vanligt förekommande metoder och properties i List<T>-klassen är: Metod/Property Beskrivning Count Antalet element i listan, alltså samma värde som Length hos en array. Add(object) Lägg till ett element i listan. Elementet lägger sig sist. Clear() Tömmer och nollställer listan. Sort() Sortera listan i stigande ordning (dvs. minsta värdet först) © EC Utbildning AB 2013-01-15 26 Collections (samlingar) • List<T> List<decimal> priceList = new List<decimal>(); // Skapa listan // Lägg till värden priceList.Add(79.9m); priceList.Add(2.5m); priceList.Add(159.0m); priceList.Add(25.5m); Console.WriteLine("Det finns {0} element i listan", priceList.Count); Det finns 4 element i listan 79,90 kr 2,50 kr 159,00 kr 25,50 kr Uppdaterad och sorterad lista: 2,50 kr 25,50 kr 30,90 kr 79,90 kr Uppdaterad lista: Det finns 1 element i listan 10,50 kr // stega igenom alla element foreach (decimal price in priceList) { Console.WriteLine(price.ToString("c")); } priceList[2] = 30.90M; // uppdatera andra elementet priceList.Sort(); // sortera listan Console.WriteLine("\nUppdaterad och sorterad lista:"); foreach (decimal price in priceList) { Console.WriteLine(price.ToString("c")); } priceList.Clear(); priceList.Add(10.5m); //Töm listan... //Och lägg till ett värde Console.WriteLine("\nUppdaterad lista:"); Console.WriteLine("Det finns {0} element i listan", priceList.Count); foreach (decimal price in priceList) { Console.WriteLine(price.ToString("c")); } Console.ReadKey(); © EC Utbildning AB 2013-01-15 27 Collections (samlingar) • Dictionary<TKey, TValue> – Ibland används två värden av olika datatyp ihop i ett par. – Då är klassen Dictionary användbar då den sparar en ”nyckel” som ger tillgång till ett värde. Exempel på tillämpningar kan vara • Ett uppslagsverk (som namnet antyder) – slå upp ett ord och du får en beskrivning • Prislista – en produkt är bunden till ett pris. © EC Utbildning AB 2013-01-15 28 Collections (samlingar) • Dictionary<TKey, TValue> – Vanligt förekommande metoder och properties i Dictionary-klassen är (förutom de som nämnts om List): Metod/Property Beskrivning Add(TKey, TValue) Lägg till ett ”element-par”. ContainsKey(TKey) Returnerar true om nyckeln finns i samlingen, false annars. ContainsValue(TValue) Returnerar true om värdet finns i samlingen, false annars. © EC Utbildning AB 2013-01-15 29 Collections (samlingar) • Dictionary<TKey, TValue> Dictionary<string, decimal> priceList = new Dictionary<string, decimal>(); string product; decimal price; // Lägg till några produkter priceList.Add("Potatis", 6.5m); priceList.Add("Shampoo", 15m); priceList.Add("Spagetti", 12m); Spagetti kostar 12,00 kr product = "Spagetti"; //kolla så att nyckeln finns //finns inte nyckeln kommer programmet krascha! if (priceList.ContainsKey(product)) { price = priceList[product]; Console.WriteLine(product + " kostar " + price.ToString("c")); } else { Console.WriteLine("Kunde inte hitta produkten"); } Console.ReadLine(); © EC Utbildning AB 2013-01-15 30 Collections (samlingar) • Collections utan typ – Klassen ArrayList används för att, på samma sätt som en List<T>, samla ihop data. – Skillnaden mellan ArrayList och List<T> är att ArrayList kan ta alla datatyper. Vi kan alltså blanda int, decimal, string etc. hur vi vill. – Denna användes innan de generiska klasserna fanns, dvs. innan version 2.0 av .NET. – Använd om möjligt de generiska varianterna då de är säkrare. – Mer information om denna klass finns i böckerna © EC Utbildning AB 2013-01-15 31
© Copyright 2024