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