| JonoHakija.java |
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 | JonoHakija.java |