Skip to content
Snippets Groups Projects
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);
    }
}