Givet ett antal strängar vill vi räkna hur många gånger varje sträng
förekommer. Lösningen är en Map<String, Integer>
som associerar varje
sträng med antalet gånger den förekommit. Enkelt, eller hur? En
komplikation är att strängar som vi inte har sett tidigare inte finns
i tabellen, så när vi ser en sträng för första gången måste vi lägga
in den i tabellen.
Så vi loopar igenom strängarna i arrayen arg
. Tabellen m
lagrar
antalet förekomster. Vi slår upp antalet förekomster för strängen s
med metodanropet m.get(s)
. Variabeln freq
binds till resultatet, som
är av klassen Integer
. (Vad är skillnaden mellan int
och Integer
?)
Om strängen inte finns i tabellen returnerar get
inte ett objekt, utan
värdet null
. Om freq
är null
sätter vi freq
till 0
istället.
Sedan uppdaterar vi tabellen med metodanropet m.put(s, freq +
1)
. Detta ska tolkas: "strängen s
har setts freq+1
gånger.
public class Freq { public static void main(String args[]) { Map<String, Integer> m = new TreeMap<String, Integer>(); // Initialize frequency table from command line for (String s : args) { Integer freq = m.get(s); if (freq == null) { freq = 0; } m.put(s, freq + 1); } System.out.println(m.size() + " distinct words detected:"); System.out.println(m); } }
Körexempel:
$ java Freq att tänka fritt är stort att tänka rätt är större 7 distinct words detected: {att=2, fritt=1, rätt=1, stort=1, större=1, tänka=2, är=2} $
Program: program/collect/Freq.java