Att beräkna en frekvenstabell
En frekvenstabell visar hur ofta någonting inträffar. En frekvenstabell över åldern för personer kan t ex se ut så här:Ålder Antal 10 0 11 6 12 3 13 4 14 7 15 0 16 2Antag att åldern kan vara 0-99. Vi behöver då en räknare för varje förekommande ålder 0-99, dvs 100 stycken. Vi vill naturligtvis inte deklarera 100 variabler utan använder en array.
I detta exempel behöver vi alltså en array med 100 st element dvs ett element för varje möjlig ålder. T ex är elementet med index 3 räknaren för åldern 3.
Följande exempel visar hur en frekvenstabell kan beräknas i ett program som löpande frågar efter åldern:
-
Vi började ju med att alla element i arrayen var noll (satsen
int [] frek = new int[100];
) - Om den först inmatade åldern är t.ex. 4 kommer det innebära att följande utförs:
frek[4] = frek[4]+1;
, dvsfrek[4]
= 0 + 1, dvs får värdet 1. - Om nästa inmatade ålder är 4 igen kommer följande att utföras:
frek[4] = frek[4]+1;
, dvsfrek[4]
= 1 + 1, dvs får värdet 2. - Om nästa inmatade ålder är 2 kommer följande att utföras:
frek[2] = frek[2]+1;
, dvsfrek[2]
= 0 + 1, dvs får värdet 1. - Vi har nu matat in tre åldrar och i arrayen
frek
har två st element värden som är större än 0, nämligenfrek[2]
ochfrek[4]
som har värdena 1 (ett) resp 2 (två). Dvs arrayen innehåller de värden som är frekvenstabellen. - Om nästa inmatade ålder är -1 kommer loopen att avbrytas och vi får följande utskrift:
Ålder Antal 0 0 1 0 2 1 3 0 4 2 5 0 6 0 ... ... 98 0 99 0
Exempel: Räkna bokstavsfrekvenser*
I detta exempel, som kan betraktas som överkurs, ska vi räkna bokstavsfrekvenserna i en textfil. Vi gör det lite enklare genom att begränsa oss till de 26 engelska bokstäverna.
Exemplet illustrerar också aritmetik med tecken (hur man konverterar mellan int
och char
)
samt hur man kan läsa en fil tecken för tecken.
(Vi låter programmet läsa filen som innehåller själva programmet.)
Principen är densamma som ovan dvs vi ska använda bokstävernas ascii-kod som index. För att inte behöva en större array än nödvändigt translaterar vi bokstäverna till intervallet [0:25] genom att subtrahera 'a' från ascii-koden innan vi använder det som index.
import java.io.*; public class LetterFrequencies { public static void main(String[] args) throws IOException { | Vi behöver använda några klasser från IO-paketet och som vanligt måste vi deklarera att IO-undantag kan uppstå. |
int[] frequencies = new int['z' - 'a' + 1]; | En lagom stor array dvs 26 platser |
BufferedReader reader = new BufferedReader( new FileReader("LetterFrequencies.java")); |
Skapar ett objekt av typen BufferedReader som kopplas till filen LetterFrequencies.java .
Dett objekt har en read -metod som läser ett tecken.
|
int c; while ((c = reader.read()) != -1) { if (Character.isLetter(c)) { c = Character.toLowerCase(c); frequencies[c-'a']++; } } reader.close(); |
Läser filen tecken för tecken. När filen är slut returnerar read() -1 .Metoden Character.isLetter(c) returnerar true om c är en bokstav
och satsen
c = Character.toLowerCase(c)
gör c till gemen om den skulle råka vara en versal.
Slutligen användes c -'a' som index för att komma på intervallet [0:25] .
|
for (int i = 0; i <= 'z' - 'a'; i++) { System.out.format("%c %3d \t \t", (char)(i+'a'), frequencies[i]); if (i%5 == 4) { System.out.println(); } } System.out.println(); } | Utskrift med bokstäverna med deras frekvenser, 5 par per rad. |
Ladda ner programmet och testkör det!