1   import fi.jyu.mit.ohj2.Mjonot; // erota-funktio
2   
3   /**
4    * Luokka merkkijonon hakuun, staattisella metodilla toteutettu versio.
5    * @author Miika Nurminen
6    * @version 0.1 19.3.2003
7    */
8   public class JonoHakija {
9     
10    /**
11     * Metodi palauttaa annetun merkkijonon sanoista ne, jotka täsmäävät hakuehdon kanssa.
12     * Hakuehto voi sisältää korkeintaan * yhden *-jokerimerkin.
13     *
14     * Käyttöesimerkki:
15     *  jono:     "kissa istuu puussa ja katselee maailman menoa"
16     *  hakuehto: "k*"
17     *  tulos:    "kissa katselee"
18     *
19     * @param jono Sanoja sisältävä merkkijono, josta tietoja haetaan.
20     * @param hakuehto Hakuehto, jota sovelletaan jonon sanoihin
21     * @return sanat, jotka täsmäävät hakuehdon kanssa
22     */
23    public static String hae(String jono,String hakuehto) {
24      // "surkastuneet" tapaukset
25      if (hakuehto==null) return jono;
26      if (hakuehto.length()==0) return "";
27      
28      // virheellisten hakuehtojen käsittely
29      int i = hakuehto.indexOf('*');
30      if ( (hakuehto.indexOf(' ')!=-1) || (i!=hakuehto.lastIndexOf('*')) )
31        throw new IllegalArgumentException("Virheellinen hakuehto!");
32      
33      if ((jono==null) || (jono.length()==0)) return jono;
34      
35      // hakuehdon esikäsittely
36      boolean jokeri = (i!=-1); // jos equal==true, ei *-hakuehtoa
37      StringBuffer sb = new StringBuffer(hakuehto);
38      String alku = Mjonot.erota(sb,'*');
39      String loppu = sb.toString();
40      
41      // silmukka yksittäisten sanojen käsittelyyn
42      String s = null;
43      sb = new StringBuffer(jono);
44      StringBuffer result = new StringBuffer(jono.length());
45      while (true) {
46        if (sb.length()==0) return result.toString();
47        s = Mjonot.erota(sb,' ');
48        
49        // jokerihakuun liittyvät ehdot
50        if (s.length()<alku.length()+loppu.length()) continue;
51        if (s.indexOf(alku)!=0) continue;
52        if ((!jokeri) && (s.length()>alku.length())) continue;
53        if (s.lastIndexOf(loppu)!=s.length()-loppu.length()) continue;
54        
55        if (result.length()!=0) result.append(" ");
56        result.append(s);
57      }
58    }
59    
60    /**
61     * Testausmetodi hakufunktiolle
62     * @param jono Sanoja sisältävä merkkijono, josta tietoja haetaan.
63     * @param hakuehto Hakuehto, jota sovelletaan jonon sanoihin
64     */
65    public static void testaa(String jono,String hakuehto) {
66      System.out.println("Jono: "+jono+" - Hakuehto: "+hakuehto);
67      System.out.println("Tulos: "+hae(jono,hakuehto));
68    }
69    
70    /**
71     * Testipääohjelma
72     * @param args Komentoriviparametrit (ei käytössä)
73     */
74    public static void main(String[] args) {
75      String s = "kissa istuu puussa ja katsoo maailman menoa";
76      String[] testitapaukset = {"k*a","k*","*a","*","istuu",null,""};
77      for (int i=0; i<testitapaukset.length; i++)
78        JonoHakija.testaa(s,testitapaukset[i]);
79    }
80  }
81