Avatar billede klarskov2312 Nybegynder
21. oktober 2003 - 16:07 Der er 9 kommentarer og
1 løsning

Sammenligning af String i array

Hej

Jeg er ved at lave en ordbog i java og har et array af Strings:
private String [] words;
  public Dictionary(int capacity)
  {
    words = new String[capacity];
  }

I ordbogen kan man tilføje og slette ord, samt en method til at finde ud af om ordet allerede er i ordbogen.

Problemet er at jeg gerne vil lave det sådan at hvis brugeren indtaster et ord som ikke svarer overens med dem i ordbogen, så skal ordbogen returnere de ord som er matcher ordet bedst.En slags stave kontrol. Metoden skal teste hvert ord i arrayet mod det ord som brugeren indtaster

Så jeg ville høre om der er nogen der har en ide til hvordan dette kunne laves. Da jeg er nybegynder i Java, ville det være behjælpeligt hvis jeg kunne få nogen kommentarer og ikke bare svaret i koden.

På forhånd tak.
Avatar billede simonvalter Praktikant
21. oktober 2003 - 16:35 #1
tror jeg ville hvis man ikke rammer det precise ord søge listens ord efter og se om de retunerer -1 .. hvis ikke indeholder ordet dit indtastede ord og det kunne være det du ledte efter ..
søg på tro og få feks troede tilbage. 
måske kan man splitte hver string op i bogstaver og så teste dem mod bogstaverne i dit array .. og så have en eller anden acceptabel grænse for hvor mange fejl der må være..

skal du gøre mere ud af det kunne du ligge kendte fejl ind i programmet .. men det kræver en del at opsamle sådan en database .. du kunne undervejs give muligheden for at tilføje dem ..

ellers ved jeg ikke hvordan word og andre programmer håndterer sådan noget, men det må være noget avanceret kodning de har gang i ;)

men jeg ville da også godt vide hvordan en ekspert ville håndtere sådan noget.
Avatar billede arne_v Ekspert
21. oktober 2003 - 16:39 #2
Dit første valg er valg af data struktur:

usorteret array = sekventiel søgning

sorteret array = binær søgning

binært træ = binær søgning

Så skal du vælge mellem typer af søgning:

eksakt match : "arne" = "arne"

starter med : "ar" = "arne" & "arte"

"lyder som" : "kristian" = "christian"
Avatar billede arne_v Ekspert
21. oktober 2003 - 16:40 #3
Jeg har noget kode liggende til sorteret array & starter med.
Avatar billede arne_v Ekspert
21. oktober 2003 - 16:42 #4
Det her lavede jeg til et andet spørgsmål her på E:

import java.util.Arrays;
import java.util.HashMap;

public class NameLookup {
  private HashMap data = null;
  public NameLookup() {
      data = new HashMap();
      String[] as = { "Arne", "Anders", "Asger", "Allan" };
      String[] bs = { "Børge", "Benny", "Brian", "Billy", "Bastian", "Bo", "Benjamin", "Be" };
      String[] cs = { };
      Arrays.sort(as);
      Arrays.sort(bs);
      Arrays.sort(cs);
      data.put("A", as);
      data.put("B", bs);
      data.put("C", cs);
  }
  public String matches(String s) {
      if(s.length() < 1) {
        return "";
      }
      String[] a = (String[])data.get(s.substring(0,1));
      if(a == null) {
        return "";
      }
      if(a.length <= 0) {
        return "";
      }
      StringBuffer sb = new StringBuffer("");
      int l = 0;
      int lmax = a.length - 1;
      while(lmax > l) {
        int med = (l + lmax) / 2;
        int cmp = s.compareTo(a[med]);
        if(cmp <= 0) {
            lmax = med;
        } else if(cmp > 0) {
            l = med + 1;
        }
      }
      if(a[l].indexOf(s) != 0) {
        return "";
      }
      int r = l;
      while((r < a.length) && (a[r].indexOf(s) == 0)) {
        r++;
      }
      for(int i = l; i < r; i++) {
        if(i > l) {
            sb.append(" ");
        }
        sb.append(a[i]);
      }
      return sb.toString();
  }
  private static NameLookup wl;
  public static void main(String[] args) {
      wl = new NameLookup();
      test("As");
      test("Ax");
      test("Be");
      test("Ba");
      test("Bø");
      test("B");
      test("Ca");
      test("De");
  }
  public static void test(String s) {
      System.out.println(s + " : " + wl.matches(s));
  }
}
Avatar billede klarskov2312 Nybegynder
21. oktober 2003 - 19:26 #5
Tak for buddet...men det jeg har er et usorteret array. Dette skyldes at jeg stadig er i skole og vi er ikke kommet længere end til blot array. Desuden skal jeg beklage de lange svar tider, da jeg går i skole i usa, er tidszonen lidt anderledes.

Men som sagt er det et usorteret array. jeg har overvejet at sammenligne hvert ord i arrayet med det ord som brugeren indtaster og tage et bogstav ad gangen i de 2 ord og alt efter hvor mange bogstaver der passer sammen vil ordet få point, og så de ord med flest point vil vil blive tilbudt brugere.
Beklager min formulering ikke er helt gennemskuelig.
Avatar billede arne_v Ekspert
21. oktober 2003 - 20:05 #6
Usorteret array betyder bare at du er nødt til at løbe hele arrayet igennem
når du skal lede efter noget.

Ikke hurtigt men simpelt.

Jeg tror at den næsten match funktionalitet bliver svær at implementere.

Min anbefaling vil være at nøjed med "starter med" funktionalitet.

Hvis du vil igang med det andet så var der fornylig en tråd hvor du kan
genbruge noget logik.
Avatar billede arne_v Ekspert
21. oktober 2003 - 20:06 #7
Avatar billede klarskov2312 Nybegynder
21. oktober 2003 - 20:50 #8
Oki tak Arne...så er det bare lige et sidste spg, hvordan overfore jeg pointene til dig...sorry men er som sagt også nybegynder her.
Avatar billede arne_v Ekspert
21. oktober 2003 - 20:54 #9
Hvis jeg ligger et svar is.f. at kommentere så skulle det være nemt.
Avatar billede klarskov2312 Nybegynder
21. oktober 2003 - 23:01 #10
tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester