From 27a01a762419f4bdf063b33b691caa369d24b043 Mon Sep 17 00:00:00 2001 From: vesal <vesa.t.lappalainen@jyu.fi> Date: Mon, 11 Mar 2024 12:20:08 +0200 Subject: [PATCH] live19 --- luennot/live19/.classpath | 8 +- luennot/live19/sanat.txt | 3 + luennot/live19/src/laskuri/Sana.java | 84 +++++++++ luennot/live19/src/laskuri/Sanalaskuri.java | 47 +++++ luennot/live19/src/laskuri/Sanat.java | 162 ++++++++++++++++++ luennot/live19/src/laskuri/test/SanaTest.java | 49 ++++++ .../live19/src/laskuri/test/SanatTest.java | 45 +++++ 7 files changed, 397 insertions(+), 1 deletion(-) create mode 100644 luennot/live19/sanat.txt create mode 100644 luennot/live19/src/laskuri/Sana.java create mode 100644 luennot/live19/src/laskuri/Sanalaskuri.java create mode 100644 luennot/live19/src/laskuri/Sanat.java create mode 100644 luennot/live19/src/laskuri/test/SanaTest.java create mode 100644 luennot/live19/src/laskuri/test/SanatTest.java diff --git a/luennot/live19/.classpath b/luennot/live19/.classpath index fb50116..313a831 100644 --- a/luennot/live19/.classpath +++ b/luennot/live19/.classpath @@ -1,6 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"> + <attributes> + <attribute name="module" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/ohj2"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/luennot/live19/sanat.txt b/luennot/live19/sanat.txt new file mode 100644 index 0000000..4662eaf --- /dev/null +++ b/luennot/live19/sanat.txt @@ -0,0 +1,3 @@ +kissa istuu puussa +kissa naukuu +kissa naukuu \ No newline at end of file diff --git a/luennot/live19/src/laskuri/Sana.java b/luennot/live19/src/laskuri/Sana.java new file mode 100644 index 0000000..d64d2f6 --- /dev/null +++ b/luennot/live19/src/laskuri/Sana.java @@ -0,0 +1,84 @@ + +package laskuri; + +/** + * Luokka, joka laskee yhden sanan esiintymiskertoja + * @author Vesa Lappalainen + * @version 1.0, 11.03.2003 + * + * <pre> + * kissa + * 1 + * </pre> + * + */ +public class Sana { + + private int lkm; + private final String teksti; + + /** + * alustaa sanan + * @param s mitä sanaa laskee + */ + public Sana(String s) { + this.lkm = 0; + this.teksti = s; + } + + + /** + * Verrataan onko tutkittava jono + * @param s tutkittava jono + * @return true jos sama kuin s + * <pre name="test"> + * Sana sana = new Sana("kissa"); + * sana.oletko("kissa") === true; + * sana.oletko("kISSA") === true; + * sana.oletko("kiss") === false; + * </pre> + */ + public boolean oletko(String s) { + return this.teksti.equalsIgnoreCase(s); + } + + + /** + * Lisätään laskuria yhdellä + * <pre name="test"> + * Sana sana = new Sana("kissa"); + * sana.toString() === "kissa: 0"; + * sana.lisaa(); + * sana.toString() === "kissa: 1"; + * sana.lisaa(); + * sana.toString() === "kissa: 2"; + * </pre> + */ + public void lisaa() { + lkm++; + } + + + /** + * @return sana ja määrä merkkijonona + * <pre name="test"> + * Sana sana = new Sana("kissa"); + * sana.toString() === "kissa: 0"; + * </pre> + */ + @Override + public String toString() { + return teksti + ": " + lkm; + } + + + /** + * @param args ei käytössä + */ + public static void main(String[] args) { + Sana sana = new Sana("kissa"); + if ( sana.oletko("kana") ) sana.lisaa(); + System.out.println(sana.toString()); + } + +} \ No newline at end of file diff --git a/luennot/live19/src/laskuri/Sanalaskuri.java b/luennot/live19/src/laskuri/Sanalaskuri.java new file mode 100644 index 0000000..97ef774 --- /dev/null +++ b/luennot/live19/src/laskuri/Sanalaskuri.java @@ -0,0 +1,47 @@ +package laskuri; + +import java.io.IOException; + +/** + * Ohjelmalla lasketaan tiedostossa olevien sanojen + * esiintymismääriä. + *<pre> + * Tarvitaan luokat: + * Sana + * - lisää laskuria + * - tunnista sana + * + * Sanat + * - lue tiedosto + * - etsi sana + * - pätki rivi + * + * Algoritmi: + * 1) Lue tiedostosta rivi. + * 2) Pätki rivi sanoiksi + * 3) Lisää kunkin sanan esiintymismäärää yhdellä + * - jos sanaa ei vielä ole ennestään, lisää sana + * 4) jatka 1) kunnes koko tiedosto käsitelty + * + *</pre> + * @author Vesa Lappalainen + * @version 1.0, 21.02.2003 + */ +public class Sanalaskuri { + + /** + * Lasketaan tiedostossa olevat sanat + * @param args ei käytössä + */ + public static void main(String[] args) { + Sanat sanat; + sanat = new Sanat(); + try { + sanat.lueTiedostoJaLaske("sanat.txt"); + sanat.tulosta(System.out); + } catch (IOException e) { + System.err.println("Ei aukea sanat.txt"); + } + } +} + \ No newline at end of file diff --git a/luennot/live19/src/laskuri/Sanat.java b/luennot/live19/src/laskuri/Sanat.java new file mode 100644 index 0000000..8889df3 --- /dev/null +++ b/luennot/live19/src/laskuri/Sanat.java @@ -0,0 +1,162 @@ +package laskuri; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Scanner; +import java.io.File; + + +/** + * Luokka sanojen esiintymismäärien laskemiseksi. + * @author Vesa Lappalainen + * @version 1.0, 21.02.2003 + */ +public class Sanat { + + private Collection<Sana> alkiot = new ArrayList<Sana>(); + + /** + * alustetaan sanat + */ + public Sanat() { + // koska alustettu jo esitetlyn yhteydessä + } + + + /** + * Lisätään uusi sana rakenteeseen. Jos on jo, lisätään vanhan määrää, + * muuten luodaan uusi sana + * @param s lisättävä sana + * @example + * <pre name="test"> + * #import java.io.ByteArrayOutputStream; + * #import static fi.jyu.mit.ohj2.VertaaTiedosto.*; + * ByteArrayOutputStream bs = new ByteArrayOutputStream(); + * Sanat sanat = new Sanat(); + * 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,"kissa: 2\nkana: 1\n") === null; + * </pre> + */ + public void lisaa(String s) { + for (Sana sana : alkiot) { + if ( sana.oletko(s) ) { + sana.lisaa(); + return; + } + } + Sana sana = new Sana(s); + sana.lisaa(); + alkiot.add(sana); + } + + + /** + * Tulostetaan koko rakenne tietovirtaan + * @param os tietovirta johon tulostetaan + * @example + * <pre name="test"> + * ByteArrayOutputStream bs = new ByteArrayOutputStream(); + * Sanat sanat = new Sanat(); + * sanat.tulosta(bs); + * bs.toString() === ""; + * sanat.lisaa("kissa"); sanat.tulosta(bs); + * vertaaString(bs,"kissa: 1\n") === null; + * </pre> + */ + public void tulosta(OutputStream os) { + PrintStream out = new PrintStream(os); + + for (Sana sana : alkiot) + out.println(sana); + } + + + /** + * Pilkotaan rivi sanoiksi ja lisätään ne kaikki rakenteeseen + * @param rivi käsiteltävä rivi + * @example + * <pre name="test"> + * ByteArrayOutputStream bs = new ByteArrayOutputStream(); + * Sanat sanat = new Sanat(); + * sanat.kasitteleRivi("kissa kana kissa"); sanat.tulosta(bs); + * vertaaString(bs,"kissa: 2\nkana: 1\n") === null; + * sanat.kasitteleRivi("kissa istuu kana"); sanat.tulosta(bs); + * vertaaString(bs,"kissa: 3\nkana: 2\nistuu: 1\n") === null; + * </pre> + */ + public void kasitteleRivi(String rivi) { + /* + String s; + StringTokenizer st = new StringTokenizer(rivi,"[ ,();.:{}\"!?+\\-\\[\\]]+"); + while ( st.hasMoreTokens() ) { + s = st.nextToken(); + lisaa(s); + } + */ + String[] palat = rivi.split("[ ,();.:{}\"!?+\\-\\[\\]]+"); + for (String s: palat) + if ( !s.isEmpty() ) + lisaa(s); + } + + /** + * Luetaan tiedoston kaikki rivit ja käsitellään laskemalla kaikki sanat + * @param tiedostonNimi tiedoston nimi, jota luetaan + * @throws IOException jos tiedostoa ei voi käsitellä + * <pre name="test"> + * #THROWS IOException + * #import java.io.*; + * kirjoitaTiedosto("sanatLueKoe.txt","kissa kana kissa\nkissa istuu kana"); + * ByteArrayOutputStream bs = new ByteArrayOutputStream(); + * Sanat sanat = new Sanat(); + * sanat.lueTiedostoJaLaske("sanatLueKoe.txt"); sanat.tulosta(bs); + * vertaaString(bs,"kissa: 3\nkana: 2\nistuu: 1\n") === null; + * tuhoaTiedosto("sanatLueKoe.txt"); + * </pre> + */ + /** + * Luetaan tiedoston kaikki rivit ja käsitellään laskemalla kaikki sanat + * @param tiedostonNimi tiedoston nimi, jota luetaan + * @throws IOException jos tiedostoa ei voi käsitellä + * <pre name="test"> + * #THROWS IOException + * #import java.io.*; + * kirjoitaTiedosto("sanatLueKoe.txt","kissa kana kissa\nkissa istuu kana"); + * ByteArrayOutputStream bs = new ByteArrayOutputStream(); + * Sanat sanat = new Sanat(); + * sanat.lueTiedostoJaLaske("sanatLueKoe.txt"); sanat.tulosta(bs); + * vertaaString(bs,"kissa: 3\nkana: 2\nistuu: 1\n") === null; + * tuhoaTiedosto("sanatLueKoe.txt"); + * </pre> + */ + public void lueTiedostoJaLaske(String tiedostonNimi) throws IOException { + try (Scanner fi = new Scanner(new FileInputStream(new File(tiedostonNimi)))) { + while ( fi.hasNext() ) { + String rivi = fi.nextLine(); + kasitteleRivi(rivi); + } + } + } + + + /** + * @param args ei käytössä + */ + public static void main(String[] args) { + Sanat sanat = new Sanat(); + sanat.lisaa("kissa"); + sanat.lisaa("kissa"); + sanat.lisaa("koira"); + sanat.tulosta(System.out); + sanat.kasitteleRivi("kissa, istuu kissa puussa"); + sanat.tulosta(System.out); + } +} \ No newline at end of file diff --git a/luennot/live19/src/laskuri/test/SanaTest.java b/luennot/live19/src/laskuri/test/SanaTest.java new file mode 100644 index 0000000..fb6bbf0 --- /dev/null +++ b/luennot/live19/src/laskuri/test/SanaTest.java @@ -0,0 +1,49 @@ +package laskuri.test; +// Generated by ComTest BEGIN +import static org.junit.Assert.*; +import org.junit.*; +import laskuri.*; +// Generated by ComTest END + +/** + * Test class made by ComTest + * @version 2024.03.11 11:36:59 // Generated by ComTest + * + */ +@SuppressWarnings("all") +public class SanaTest { + + + + // Generated by ComTest BEGIN + /** testOletko34 */ + @Test + public void testOletko34() { // Sana: 34 + Sana sana = new Sana("kissa"); + assertEquals("From: Sana line: 36", true, sana.oletko("kissa")); + assertEquals("From: Sana line: 37", true, sana.oletko("kISSA")); + assertEquals("From: Sana line: 38", false, sana.oletko("kiss")); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testLisaa48 */ + @Test + public void testLisaa48() { // Sana: 48 + Sana sana = new Sana("kissa"); + assertEquals("From: Sana line: 50", "kissa: 0", sana.toString()); + sana.lisaa(); + assertEquals("From: Sana line: 52", "kissa: 1", sana.toString()); + sana.lisaa(); + assertEquals("From: Sana line: 54", "kissa: 2", sana.toString()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testToString64 */ + @Test + public void testToString64() { // Sana: 64 + Sana sana = new Sana("kissa"); + assertEquals("From: Sana line: 66", "kissa: 0", sana.toString()); + } // Generated by ComTest END +} \ No newline at end of file diff --git a/luennot/live19/src/laskuri/test/SanatTest.java b/luennot/live19/src/laskuri/test/SanatTest.java new file mode 100644 index 0000000..e91521b --- /dev/null +++ b/luennot/live19/src/laskuri/test/SanatTest.java @@ -0,0 +1,45 @@ +package laskuri.test; +// Generated by ComTest BEGIN +import java.io.ByteArrayOutputStream; +import static fi.jyu.mit.ohj2.VertaaTiedosto.*; +import static org.junit.Assert.*; +import org.junit.*; +import laskuri.*; +// Generated by ComTest END + +/** + * Test class made by ComTest + * @version 2024.03.11 11:37:08 // Generated by ComTest + * + */ +@SuppressWarnings("all") +public class SanatTest { + + + // Generated by ComTest BEGIN + /** testLisaa30 */ + @Test + public void testLisaa30() { // Sanat: 30 + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + Sanat sanat = new Sanat(); + sanat.lisaa("kissa"); sanat.tulosta(bs); + assertEquals("From: Sanat line: 36", null, vertaaString(bs,"kissa: 1\n")); + sanat.lisaa("kissa"); sanat.tulosta(bs); + assertEquals("From: Sanat line: 38", null, vertaaString(bs,"kissa: 2\n")); + sanat.lisaa("kana"); sanat.tulosta(bs); + assertEquals("From: Sanat line: 40", null, vertaaString(bs,"kissa: 2\nkana: 1\n")); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testTulosta52 */ + @Test + public void testTulosta52() { // Sanat: 52 + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + Sanat sanat = new Sanat(); + sanat.tulosta(bs); + assertEquals("From: Sanat line: 56", "", bs.toString()); + sanat.lisaa("kissa"); sanat.tulosta(bs); + assertEquals("From: Sanat line: 58", null, vertaaString(bs,"kissa: 1\n")); + } // Generated by ComTest END +} \ No newline at end of file -- GitLab