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å.