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