Avatar billede a-torsten Nybegynder
23. april 2003 - 10:00 Der er 16 kommentarer og
1 løsning

OrdTjekker Klasse - Virker den ?

Jeg har lavet følgende klasse :

public class ordTester
{
    public static String ord = "datamatiker";
    public static String bogstav = "ggdggaggtggaggmgagtggigkggeggr";
    public static char[] bogstavliste = bogstav.toCharArray();

    public static void main(String args[])
    {
        tjekBogstaver(bogstavliste,ord);       
    }
   
    public static void tjekBogstaver(char[] bogstavArray, String ord)
    {
        char[] ordArray = ord.toCharArray();
        int fundetBogstaver = 0;
       
        for(int i = 0; i < bogstavArray.length;i++)
        {
            for(int x = 0; x < ordArray.length;x++)
            {
                if (bogstavArray[i]==ordArray[x])
                {
                    bogstavArray[i] = '@';
                    fundetBogstaver++;
                }                               
            }
        }
           
        if (ordArray.length==fundetBogstaver)
        System.out.println("ordet kan dannes!!");   
    }
}


Umiddelbart ser den ud til at virke, men er der nogle af jer der kan se nogle faldgrupper i den..?

Den skal tjekke at et ord kan laves ud fra et array af bogstaver... Og bogstaverne må kun bruges en gang, så er ordet = otto, skal der være 2 o´er og 2 t´er for den skal give svar tilbage....

Har jeg gjort det godt ?

-Anders
Avatar billede arne_v Ekspert
23. april 2003 - 10:26 #1
Jeg kan umiddelbart se 2 problemer:
  - flere kald
  - ord med @
Avatar billede soreno Praktikant
23. april 2003 - 10:27 #2
skal:
adtamatiker

også kunne bliver til:
datamatiker
?
Avatar billede arne_v Ekspert
23. april 2003 - 10:29 #3
Det første problem kan løses med:

public class OrdTester {
    public static String ord = "datamatiker";
    public static String bogstav = "ggdggaggtggaggmgagtggigkggeggr";
    public static char[] bogstavliste = bogstav.toCharArray();

    public static void main(String args[]) {
        tjekBogstaver(bogstavliste, ord);
        tjekBogstaver(bogstavliste, ord);
    }

    public static void tjekBogstaver(char[] bogstavArray, String ord) {
        char[] ordArray = ord.toCharArray();
        int fundetBogstaver = 0;
        char[] bogstavArray2 = (char[]) bogstavArray.clone(); // <-----
        for (int i = 0; i < bogstavArray2.length; i++) {
            for (int x = 0; x < ordArray.length; x++) {
                if (bogstavArray2[i] == ordArray[x]) {
                    bogstavArray2[i] = '@';
                    fundetBogstaver++;
                }
            }
        }

        if (ordArray.length == fundetBogstaver)
            System.out.println("ordet kan dannes!!");
        else
            System.out.println("ordet kan ikke dannes!!");

    }
}
Avatar billede arne_v Ekspert
23. april 2003 - 10:38 #4
Jeg tror at følgende variant er bedre:

public class OrdTester {
    public static String ord = "datamatiker";
    public static String bogstav = "ggdggaggtggaggmgagtggigkggeggr";

    public static void main(String args[]) {
        tjekBogstaver(bogstav, ord);
        tjekBogstaver(bogstav, ord);
        tjekBogstaver(bogstav, "zzz");
        tjekBogstaver(bogstav, "@");
    }

    public static void tjekBogstaver(String bogstav, String ord) {
        int fundetBogstaver = 0;
        for (int i = 0; i < bogstav.length(); i++) {
            for (int x = 0; x < ord.length(); x++) {
                if (bogstav.charAt(i) == ord.charAt(x)) {
                    fundetBogstaver++;
                }
            }
        }

        if (ord.length() <= fundetBogstaver)
            System.out.println("ordet kan dannes!!");
        else
            System.out.println("ordet kan ikke dannes!!");

    }
}
Avatar billede a-torsten Nybegynder
23. april 2003 - 10:47 #5
arne...

ddatamatiker kan også dannes ud af din methode.... selv om der kun er 1 d i bogstavArray´et...

-Anders
Avatar billede a-torsten Nybegynder
23. april 2003 - 10:50 #6
Det med flere kald er ikke et problem... Jeg har en klasse der danner en bogstavliste i constructoren.. Så der laver jeg bare en bogstaver.getListe(), som så returnere listen.... Men klart.... Hvis det bare er den klasse jeg har lavet som skal køre er det jo et problem..



Soreno..

Ordet kunne også være hundeprut ... Den tjekker så om det kan dannes ud fra det bogstavArray....

-Anders
Avatar billede a-torsten Nybegynder
23. april 2003 - 10:54 #7
Men klar....

if (ord.length() = fundetBogstaver)
skal self. laves om til
if (ord.length() <= fundetBogstaver)

så det var da en fejl :o)
Avatar billede soreno Praktikant
23. april 2003 - 10:55 #8
Jow, men bogstaverne i "public static String bogstav" skal komme i samme rækkefølge som i "public static String ord" ?

Ellers kunne du lave en anden løsning.
Lav en struktur som har (key, antal) (kan ikke huske hvad strukturen hedder, men jeg er ret sikker på den ligger i java.util.???), hvor key er bogstavet og antal er antallet af forekomster i "bogstav".
Så kan du teste om ordet kan dannes ved at teste om der er nok bogstaver i strukturen.

(Måske jeg har misforstået problemet.. :-)
Avatar billede a-torsten Nybegynder
23. april 2003 - 10:57 #9
Soreno....

adtamatiker kan sagtens findes..... rækkefølgen har for mig at se ingen betydning....



-Anders
Avatar billede soreno Praktikant
23. april 2003 - 11:01 #10
Du har ret, da jeg testede må jeg have lavet en eller anden fejl :-)
Avatar billede arne_v Ekspert
23. april 2003 - 11:01 #11
Du har ret.

Så tag mit forrige forslag.
Avatar billede arne_v Ekspert
23. april 2003 - 11:05 #12
Eller:

public class OrdTester {
    public static String ord = "datamatiker";
    public static String bogstav = "ggdggaggtggaggmgagtggigkggeggr";

    public static void main(String args[]) {
        tjekBogstaver(bogstav, "datamatiker");
        tjekBogstaver(bogstav, "datamatiker");
        tjekBogstaver(bogstav, "ddatamatiker");
        tjekBogstaver(bogstav, "zzz");
        tjekBogstaver(bogstav, "@");
    }

    public static void tjekBogstaver(String bogstav, String ord) {
        boolean[] used = new boolean[bogstav.length()];
        for(int i = 0; i < used.length; i++) used[i] = false;
        int fundetBogstaver = 0;
        for (int i = 0; i < bogstav.length(); i++) {
            for (int x = 0; x < ord.length(); x++) {
                if (!used[i] && (bogstav.charAt(i) == ord.charAt(x))) {
                    fundetBogstaver++;
                    used[i] = true;
                }
            }
        }

        if (ord.length() <= fundetBogstaver)
            System.out.println("ordet kan dannes!!");
        else
            System.out.println("ordet kan ikke dannes!!");

    }
}

[jeg kan ikke lide den @]
Avatar billede a-torsten Nybegynder
23. april 2003 - 11:10 #13
arne.... hva gør du så når du skriver emails ;o)

Ej... Jeg har ingren skrupler med at bruge den, da jeg ved at mit ord eller mine bogstaver kommer til at indeholde @ ..

Men din sidste løsning er nu heller ikk så ringe ;o) Så du får de point ....

-Anders
Avatar billede arne_v Ekspert
23. april 2003 - 11:26 #14
Jeg kan godt begrunde mine holdninger:

1) det med char arrayet der blev ændret og gav andet resultat
  anden gang er det man kalder en side effect - generelt bør man undgå
  den slags side effects - selvom det ikke er noget problem her og nu, så
  kan det give store problemer den dag en anden programmør genbruger
  koden i en anden sammenhæng

2) det med used i.s.f. @ er også noget som en future maintenance programmør
  vil sætte pris på - han har nok en fornemmelse af hvad used variablen
  gør mens @ vil gør ham lidt bekymret over om der nu er noget
  specielt med den @
Avatar billede a-torsten Nybegynder
29. april 2003 - 12:41 #15
Arne... Hvorfor virker ordet JAN i denne..??

public class OrdTester3 {
 
    public static String bogstav = "jakkthkcaiooaurquayx";

    public static void main(String args[]) {
        tjekBogstaver(bogstav, "kat");
        tjekBogstaver(bogstav, "kakao");
        tjekBogstaver(bogstav, "jan");
        tjekBogstaver(bogstav, "ddatamatiker");
        tjekBogstaver(bogstav, "zzz");
        tjekBogstaver(bogstav, "@");
    }

    public static void tjekBogstaver(String bogstav, String ord) {
        boolean[] used = new boolean[bogstav.length()];
        for(int i = 0; i < used.length; i++) used[i] = false;
        int fundetBogstaver = 0;
        for (int i = 0; i < bogstav.length(); i++) {
            for (int x = 0; x < ord.length(); x++) {
                if (!used[i] && (bogstav.charAt(i) == ord.charAt(x))) {
                    fundetBogstaver++;
                    used[i] = true;
                }
            }
        }

        if (ord.length() <= fundetBogstaver)
            System.out.println("ordet kan dannes!!");
        else
            System.out.println("ordet kan ikke dannes!!");

    }
}
Avatar billede a-torsten Nybegynder
29. april 2003 - 12:46 #16
Og JanV kan også findes.....
Avatar billede arne_v Ekspert
29. april 2003 - 12:51 #17
Den matcher flere gange på samme bogstav i ordet.

Forkert kode.

    public static void tjekBogstaver(String bogstav, String ord) {
        boolean[] used = new boolean[bogstav.length()];
        for(int i = 0; i < used.length; i++) used[i] = false;
        int fundetBogstaver = 0;
        for (int x = 0; x < ord.length(); x++) {
            for (int i = 0; i < bogstav.length(); i++) {
                if (!used[i] && (bogstav.charAt(i) == ord.charAt(x))) {
                    fundetBogstaver++;
                    used[i] = true;
                    break;
                }
            }
        }

        if (ord.length() <= fundetBogstaver)
            System.out.println(ord + " : ordet kan dannes!!");
        else
            System.out.println(ord + " : ordet kan ikke dannes!!");

    }

synes at løse det problem.
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

IT-JOB

Banedanmark

License Manager

Netcompany A/S

Network Engineer

Forsikrings- og pensionsakademiet A/S

IT-teknisk profil