-
Vesa Lappalainen authoredVesa Lappalainen authored
SanatHash.java 4.85 KiB
package tiedosto;
import java.io.*;
import fi.jyu.mit.ohj2.*;
import java.util.Map.Entry;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
/**
* Luokka sanojen esiintymismrien laskemiseksi. Toteutettu
* Hashtable-luokalle ja erillisell Laskuri-luokalla.
* @author Vesa Lappalainen
* @version 1.0, 16.03.2003
*/
public class SanatHash {
@SuppressWarnings("javadoc")
public static class Laskuri {
private int arvo;
public Laskuri(int arvo) { this.arvo = arvo; }
public void lisaa() { arvo++; }
@Override
public String toString() { return "" + arvo; }
}
private Map<String, Laskuri> alkiot = new Hashtable<String, Laskuri>();
/**
* Listn uusi sana rakenteeseen. Jos on jo, listn vanhan mr,
* muuten luodaan uusi sana
* @param s listtv sana
* @example
* <pre name="test">
* #import java.io.ByteArrayOutputStream;
* #import static fi.jyu.mit.ohj2.VertaaTiedosto.*;
* ByteArrayOutputStream bs = new ByteArrayOutputStream();
* SanatHash sanat = new SanatHash();
* sanat.lisaa("kissa"); sanat.tulosta(bs);
* vertaaString(bs,"kissa=1\n") === null;
* sanat.lisaa("kissa"); sanat.tulosta(bs);
* vertaaString(bs,"kissa=2\n") === null;
* sanat.lisaa("kana"); sanat.tulosta(bs);
* vertaaString(bs,"kana=1\nkissa=2\n") === null;
* </pre>
*/
public void lisaa(String s) {
String sp = s.toLowerCase();
Laskuri sana = alkiot.get(sp);
if (sana != null) {
sana.lisaa();
return;
}
sana = new Laskuri(1);
alkiot.put(sp, sana);
}
/**
* Tulostetaan koko rakenne tietovirtaan
* @param os tietovirta johon tulostetaan
* @example
* <pre name="test">
* @example
* <pre name="test">
* #import java.io.ByteArrayOutputStream;
* #import static fi.jyu.mit.ohj2.VertaaTiedosto.*;
* ByteArrayOutputStream bs = new ByteArrayOutputStream();
* SanatHash sanat = new SanatHash();
* sanat.lisaa("kissa"); sanat.tulosta(bs);
* vertaaString(bs,"kissa=1\n") === null;
* </pre>
*/
public void tulosta(OutputStream os) {
@SuppressWarnings("resource")
PrintStream out = Tiedosto.getPrintStream(os);
Set<Entry<String, Laskuri>> entrySet = alkiot.entrySet();
for (Iterator<Entry<String, Laskuri>> i = entrySet.iterator(); i.hasNext();)
out.println(i.next());
}
/**
* Pilkotaan rivi sanoiksi ja listn ne kaikki rakenteeseen
* @param rivi ksiteltv rivi
* @example
* <pre name="test">
* ByteArrayOutputStream bs = new ByteArrayOutputStream();
* SanatHash sanat = new SanatHash();
* sanat.kasitteleRivi("kissa kana kissa"); sanat.tulosta(bs);
* vertaaString(bs,"kana=1\nkissa=2\n") === null;
* sanat.kasitteleRivi("kissa istuu kana"); sanat.tulosta(bs);
* vertaaString(bs,"istuu=1\nkana=2\nkissa=3\n") === null;
* </pre>
*/
public void kasitteleRivi(String rivi) {
String[] st = rivi.split("[ ,();.:{}+-\\[\\]]+");
for (String s : st) {
lisaa(s);
}
}
/**
* Luetaan tiedoston kaikki rivit ja ksitelln laskemalla kaikki sanat
* @param tiedostonNimi tiedoston nimi, jota luetaan
* @throws IOException jos tiedostoa ei voi ksitell
* <pre name="test">
* #THROWS IOException
* #import java.io.*;
* kirjoitaTiedosto("sanatLueKoe.txt","kissa kana kissa\nkissa istuu kana");
* ByteArrayOutputStream bs = new ByteArrayOutputStream();
* SanatHash sanat = new SanatHash();
* sanat.lueTiedostoJaLaske("sanatLueKoe.txt"); sanat.tulosta(bs);
* vertaaString(bs,"istuu=1\nkana=2\nkissa=3\n") === null;
* tuhoaTiedosto("sanatLueKoe.txt");
* </pre>
*/
public void lueTiedostoJaLaske(String tiedostonNimi) throws IOException {
@SuppressWarnings("resource")
BufferedReader fi = Tiedosto.avaa_lukemista_varten(tiedostonNimi);
if (fi == null) throw new FileNotFoundException("Ei lydy: " + tiedostonNimi);
try {
String rivi;
while ((rivi = fi.readLine()) != null) {
kasitteleRivi(rivi);
}
} finally {
fi.close();
}
}
/**
* Testataan SanatHash-luokkaa
* @param args ei kytss
*/
public static void main(String[] args) {
SanatHash sanat = new SanatHash();
sanat.lisaa("kissa");
sanat.lisaa("kissa");
sanat.lisaa("koira");
sanat.tulosta(System.out);
sanat.kasitteleRivi("kissa, istuu kissa puussa");
sanat.tulosta(System.out);
}
}