1   import fi.jyu.mit.ohj2.Mjonot; // erota-funktio
2   
3   /**
4    * Luokka merkkijonon hakuun, yleistetty "oliopohjainen" versio
5    * @author Miika Nurminen
6    * @version 0.1 19.3.2003
7    */
8   public class YleisHakija {
9     private String jono = null;
10      
11    /**
12     * Luo uuden hakijan annetulle jonolle
13     * @param jono Jono, josta sanoja haetaan
14     */
15    public YleisHakija(String jono) {
16      this.jono = jono;
17    }
18    
19    /**
20     * Metodi palauttaa annetun merkkijonon sanoista ne, jotka täsmäävät hakuehdon kanssa.
21     * Hakuehdon on toteutettava hakuehto -rajapinta
22     *
23     * @param jono Sanoja sisältävä merkkijono, josta tietoja haetaan.
24     * @param hakuehto Hakuehto, jota sovelletaan jonon sanoihin
25     * @return sanat, jotka täsmäävät hakuehdon kanssa
26     */
27    public String hae(SanaHakija hakuehto) {
28      // "surkastuneet" tapaukset
29      if (hakuehto==null) return this.jono;
30      if ((this.jono==null) || (jono.length()==0)) return jono;
31      
32      // silmukka yksittäisten sanojen käsittelyyn
33      String s = null;
34      StringBuffer sb = new StringBuffer(this.jono);
35      StringBuffer result = new StringBuffer(this.jono.length());
36      while (true) { 
37        if (sb.length()==0) return result.toString();
38        s = Mjonot.erota(sb,' ');
39  
40        if (!hakuehto.hae(s)) continue; 
41        
42        if (result.length()!=0) result.append(" ");
43        result.append(s);
44      }
45    }
46    
47    /**
48     * Testausmetodi hakufunktiolle
49     * @param jono Sanoja sisältävä merkkijono, josta tietoja haetaan.
50     * @param hakuehto Hakuehto, jota sovelletaan jonon sanoihin
51     */
52    public void testaa(SanaHakija hakuehto) {
53      System.out.println("Jono: "+jono+" - Hakuehto: "+hakuehto.toString());
54      System.out.println("Tulos: "+hae(hakuehto));
55    }
56    
57    /**
58     * Testipääohjelma
59     * @param args Komentoriviparametrit (ei käytössä)
60     */
61    public static void main(String[] args) {
62      YleisHakija h = new YleisHakija("kissa istuu puussa ja katsoo maailman menoa");
63      String[] testitapaukset = {"k*a","k*","*a","*","istuu",null,""};
64  
65      System.out.println("Testataan jokerihakua:");
66      for (int i=0; i<testitapaukset.length; i++)
67        h.testaa(new JokeriHakija(testitapaukset[i]));
68  
69      System.out.println();
70      
71      System.out.println("Testataan pituushakua:");
72      for (int i=0; i<9; i++)
73        h.testaa(new PituusHakija(i));
74    }
75  }
76