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
frekhar 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!