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       2

Antag 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:

int [] frek = new int[100]; // 100 elements initially set to 0 Scanner input = new Scanner(System.in); while (true) { System.out.print("Ge ålder: "); int age = input.nextInt(); if ((age >= 0) && (age <= 99)) { frek[age] = frek[age] + 1; // Use the age as index in the array } else { break; // leave the while-loop } } input.close(); // Don't need the scanner anymore System.out.println("Ålder" + "\t" + "Antal"); for (int age = 0; age <= 99; age++) { System.out.println(" " + age + "\t" + frek[age]); }
  1. Vi började ju med att alla element i arrayen var noll (satsen int [] frek = new int[100];)
  2. Om den först inmatade åldern är t.ex. 4 kommer det innebära att följande utförs: frek[4] = frek[4]+1;, dvs frek[4] = 0 + 1, dvs får värdet 1.
  3. Om nästa inmatade ålder är 4 igen kommer följande att utföras: frek[4] = frek[4]+1;, dvs frek[4] = 1 + 1, dvs får värdet 2.
  4. Om nästa inmatade ålder är 2 kommer följande att utföras: frek[2] = frek[2]+1;, dvs frek[2] = 0 + 1, dvs får värdet 1.
  5. Vi har nu matat in tre åldrar och i arrayen frek har två st element värden som är större än 0, nämligen frek[2] och frek[4] som har värdena 1 (ett) resp 2 (två). Dvs arrayen innehåller de värden som är frekvenstabellen.
  6. 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!

Valid CSS!