1 Arrayer Vid beräkningar med större datamängder än några enstaka tal är det bekvämt att kunna betrakta en talmängd som en enhet. Detta åstadkommer man genom att deklarera och instantiera fält. Ett annat namn för fält är array. int iArray[]= new int[3]; // deklarera ett heltalsfält med tre heltal int jArray[]={ 1, 3, 5, 7, 9, 11, 13, 15}; // initierat fält 8 element Andra datatyper går naturligtvis också bra. För att skapa en array med punkter av vår Point-klass från tidigare kan det se ut som Point pArr[]={ new Point(), new Point() }; Vi har nu skapat två punkter. Däremot kommer satsen Point pArr[]=new Point[2]; inte skapa två punkter, utan endast skapa en behållare med plats för två punkter. Vi måste därefter använda new satsen för att skapa punkterna. För att arbeta med fält använder man sig av index-operatorn [], värdet som anges inom [ ] kallas index int iArray[]=new int[3]; iArray[0] = 4; iArray[1] = 11; iArray[2] = -2; Vi har nu tilldelat arrayen värdena 4, 1 och 2. Tänk dig arrayen som en tabell där varje rad är numrerad med början på 0. iArray index värde 0 1 2 4 11 -2 Man använder index både för at läsa av ett värde och att tilldela ett värde int iArray[]=new int[3]; iArray[0] = 4; iArray[1] = 11; iArray[2] = -2; System.out.println( iArray[0] * iArray[1] ); // skriver ut 44 Notera att satsen int myArray[]= new int[100]; Skapar hundra heltal med index från 0 till 99 För dessa fält gäller samma som för vanliga variabler, dvs är de inte initierade kan vilka värden som helst finnas bland heltalen/flyttalen. Exempel, inmatning och beräkning av summa och medelvärde av 10 flyttal import java.util.*; public class Main { public static void main(String[] args) { double myArray[]= new double[10]; Scanner keyb= new Scanner(System.in); for(int i = 0; i < myArray.length; i++) { System.out.println("Mata in tal nr " + (i+1) ); myArray[ i ]= keyb.nextDouble(); } double avg; double sum = 0; for(int i = 0; i<myArray.length; i++) { // beräkna summa först sum+= myArray[ i ]; } avg = sum/ 10.0; System.out.println("Summan är:"+ sum); System.out.println("Medelvärdet är:"+ avg); } } Resultatet av en programkörning kan bli Mata in tal 1.0 Mata in tal 4.0 Mata in tal 7.0 Mata in tal 6.0 Mata in tal 7.0 Mata in tal 13.3 Mata in tal 12.98 Mata in tal 5.4 Mata in tal 3.3 Mata in tal 3.2 Medelvärdet nr 1 nr 2 nr 3 nr 4 nr 5 nr 6 nr 7 nr 8 nr 9 nr 10 är:6.318 Det i särklass viktigaste hjälpmedelet för att hantera arrayer är for-satsen for(int i = 0; i < myArray.length; i++) { System.out.println("Mata in tal nr " + (i+1) ); myArray[ i ]= keyb.nextDouble(); } En array är av en speciell klass, med det enda attributet length. forsatsen kan man läsa ut som for( första index; repetera till sista index; nästa index ) ... satser Notera att längden är ett mer än vad forsatsen ser. Längden 10 repetitionen till och med 9. Heltalet i antar värdet 10 iom sista jämförelsen. Förbättrad version med uppdelning i metoder. Flera av delarna i programmet ovan kan delas upp i metoder. Man delar gärna upp programmet i återanvändbara delar. Java APIt är ju en samling komponenter med återanvändbara delar. I sitt eget program tar man ingen hänsyn till andras behov av återanvändbara delar utan använder metoder för att göra programmet lättläst. De delar som vi vill förenkla är summaberäkningen och medelberäkningen. Förenklingen består av att vi flyttar ut beräkningen av summan och medelvärdet till metoder. import java.util.*; public class Main { public static double sum(double [] dArray){ double sumResult = 0; for(int i = 0; i<dArray.length; i++) { sumResult+= dArray[ i ]; } return sumResult; } // beräkna summa först public static double average(double [] dArray){ return sum(dArray)/dArray.length; } public static void main(String[] args) { double myArray[]= new double[10]; Scanner keyb= new Scanner(System.in); for(int i = 0; i < myArray.length; i++) { System.out.println("Mata in tal nr " + (i+1) ); myArray[ i ]= keyb.nextDouble(); } double avg = average(myArray); double sum = sum(myArray); System.out.println("Summan är:"+ sum); System.out.println("Medelvärdet är:"+ avg); } } Analysera exemplet noga. Det är ett gott exempel på hur ett relativt komplicerat huvudprogram kan delas upp i mindre uppgifter, och hur resultatet blir ett överskådligt huvudprogram med klara avsikter. Metoderna är dessutom generella och kan återanvändas i någon annan del av programmet. Du måste på egen hand kunna beskriva och implementera summaberäkningen. Se även avsnittet standardalgoritmer för andra exempel med numeriska fält. 2 Objekt av applikationsklassen I NetBeansmiljön finns en konstruerare definierad för den klass som skapas vid projektstart. Som vi sett i bland annat Point exemplet används new för att anropa konstruerare och skapa objekt. Vi kan enkelt skriva om exemplet ovan så att det istället skapar en instans av av klassen Main och använder metoder som hör till objektet itsället för klassen. Vi kommer alltså inte static deklarera metoderna. Det finns flera sätt att göra denna omskrivning. Det sätt som valts här, är valt för att på bästa sätt visa objektnaturen, och är kanske inte bästa sättet att utforma applikationen. import java.util.*; public class ArrayInput { // Arrayen som attribut, skapas då objektet skapas private double myArray[] = new double[10]; public ArrayInput(){ Scanner keyb= new Scanner(System.in); for(int i = 0; i < myArray.length; i++) { System.out.println("Mata in tal nr " + (i+1) ); myArray[ i ]= keyb.nextDouble(); } } public double sumArray(){ double sumResult = 0; for(int i = 0; i<myArray.length; i++) { // beräkna summa först sumResult+= myArray[ i ]; } return sumResult; } public double averageArray(){ return sumArray()/myArray.length; } public static void main(String[] args) { ArrayInput myObject = new ArrayInput(); double avg = myObject.averageArray(); double sum = myObject.sumArray(); System.out.println("Summan är:"+ sum); System.out.println("Medelvärdet är:"+ avg); } } Netoderna är omdöpta för att bättre illustrera deras funktion. I det tidigare exemplet gav signaturen (argumenten) deras funktion tillsammans med namnet. Metoderna deklareras inte statiska eftersom de anropas via myObject.metod ... i main( ... ) eller via en ickestatisk metod som public double averageArray(){ return this.sumArray()/myArray.length; } this är som tidigare nämnts det egna objektet. this skrivs inte ut om det inte är nödvändigt eller viktigt för läsbarheten. Arrayen med flyttalen deklareras som attribut och därför inte behöver skickar som argument till metoderna. main deklareras fortfarande som static eftersom den måste deklareras så.