spelly Skrevet 16. februar 2011 Del Skrevet 16. februar 2011 Hei! Jeg holder på å lage et simpelt spill i java. (Dere kjenner sikkert til mastermind?) Jeg har litt trøbbel med to av metodene og håper jeg kan få litt hjelp her! Koden som dere ser under skal telle hvor ofte et tegn forekommer i en streng, men jeg får det ikke til å fungere. har jeg tenkt helt feil? public static final String hemmelig = "+-*#"; public static int antallForekomst(char tegn, String streng) { int[] teller = new int[3]; //Dekalerer teller for (int i = 0; i < hemmelig.length(); i++) { //teller hvor ofte et tegn forekommer if (streng.charAt(i) == '+') {teller [0] ++; } if (streng.charAt(i) == '-') {teller [1] ++; } if (streng.charAt(i) == '*') {teller [2] ++; } if (streng.charAt(i) == '#') {teller [3] ++; } } } Den andre metoden jeg har trøbbel med er den som skal kontrollere at alle tegn i den angitte strengen forekommer i den hemmelige strengen. (metoden bruker metoden antallForekomst() public static boolean harLovligeTegn(String innStreng) { Hvordan kan jeg sjekke om alle tegn i den angitte strengen forekommer i den hemmelige? Lenke til kommentar
TSP Skrevet 16. februar 2011 Del Skrevet 16. februar 2011 (endret) Når du opererer med strenger skal du bruke streng-metoden equals(). Det kan hende at det i noen tilfeller fungerer med == "strenger", men det er absolutt ingen garanti. Jeg kan ikke love at det vil løse problemet du opplever, men det vil i alle fall gjøre koden mer riktig. Så du skal f.eks bytte ut if (streng.charAt(i) == '+') {teller [0] ++; } med if (streng.charAt(i).equals('+')) {teller [0] ++; } hvis jeg ikke husker helt feil. Du kan lese mer om hvorfor == ikke fungerer her: http://www.devdaily.com/java/edu/qanda/pjqa00001.shtml (Se avsnittet: "Java String compare: why "==" doesn't work") Endret 16. februar 2011 av TSP Lenke til kommentar
Hieronymus Skrevet 16. februar 2011 Del Skrevet 16. februar 2011 Det hadde vært veldig greit om du fortalte HVA du plagdes med. Sitter ikke med noen kompilator for hånden, så jeg kan kjøre koden din. Men, når det er sagt, så ser jeg at int-arrayet ditt er for kort. Du sier det skal være av størrelse 3, mens du vitterlig senere i koden referer til fire forskjellige posisjoner i arrayet. Ellers er det som sies av en annen i denne tråden feil, når det gjelder equals. Det gjelder ikke her, da charAt() returnerer en char, som er en primitiv, og primitive skal sammenlignes med ==. Så det gjør du riktig. Videre ser jeg nå at du ikke itererer over strengen du angir som parameter i metoden, men over strengen "hemmelig". Dvs bytt ut hemmelig.length med streng.length. Når det gjelder metode nummer to, så kan du sjekke API-dokumentasjonen for indexOf (metode i Streng-klassen) for å se om du ikke kan bruke den til å løse problemet. --- BalleB Lenke til kommentar
spelly Skrevet 16. februar 2011 Forfatter Del Skrevet 16. februar 2011 Takk for gode tilbakemeldinger! Når det gjelder spørsmål to, så hjalp ikke api dokumentasjonen meg så mye, kunne du gitt meg litt mer konkret forslag, eventuelt kode? Lenke til kommentar
Hieronymus Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Takk for gode tilbakemeldinger! Når det gjelder spørsmål to, så hjalp ikke api dokumentasjonen meg så mye, kunne du gitt meg litt mer konkret forslag, eventuelt kode? Prøv med denne: public static boolean harLovligeTegn(String innStreng) { for (int n = 0; n < hemmelig.length(); n++) { if (innStreng.indexOf(hemmelig.charAt(n)) == -1) { return false; } } return true; } --- BalleB Lenke til kommentar
Kiff Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Jeg er litt usikker på hvordan du hadde tenkt å bruke antallForekomst metoden, men hvis den bare skal telle hvor mange ganger "tegn" forekommer i "streng", ville jeg gjort noe sånt: public int antallForekomst(char tegn, String streng) { return streng.split("\\Q" + tegn + "\\E", -1).length - 1; } Lenke til kommentar
srbz Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Når du opererer med strenger skal du bruke streng-metoden equals(). Det kan hende at det i noen tilfeller fungerer med == "strenger", men det er absolutt ingen garanti. Jeg kan ikke love at det vil løse problemet du opplever, men det vil i alle fall gjøre koden mer riktig. Så du skal f.eks bytte ut if (streng.charAt(i) == '+') {teller [0] ++; } med if (streng.charAt(i).equals('+')) {teller [0] ++; } hvis jeg ikke husker helt feil. Du kan lese mer om hvorfor == ikke fungerer her: http://www.devdaily.com/java/edu/qanda/pjqa00001.shtml (Se avsnittet: "Java String compare: why "==" doesn't work") Men streng.charAt(i) vil ikke returnere en streng, den vil returnere en char, og en char er en primitiv type, altså skal '==' fungere helt greit. Eller? For å gi eksempler: public class PrimitiveTest { public static void main(String[] args) { String s1 = "streng"; String s2 = "streng"; char c1 = s1.charAt(0); char c2 = s2.charAt(0); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(c1 == c2); } } Utskrift av programmet: true true true Jeg får faktisk feilmelding når jeg prøver å skrive c1.equals(c2) fordi c1 og c2 er primitive typer som ikke har metoden equals() implementert. Merk også at s1 == s2 er true, uten at jeg på sparket kan si hvorfor. Jeg vet at det finnes unntak der to like strenger/objekter kan gi false ved bruk av == og true ved bruk av equals(), men equals() kan altså ikke brukes i det hele tatt på primitive typer som int, boolean og char. Liten pirk: det heter "å deklarere", ikke "å dekalere". Lenke til kommentar
Cx Skrevet 9. mars 2011 Del Skrevet 9. mars 2011 Jeg får faktisk feilmelding når jeg prøver å skrive c1.equals(c2) fordi c1 og c2 er primitive typer som ikke har metoden equals() implementert. Merk også at s1 == s2 er true, uten at jeg på sparket kan si hvorfor. Jeg vet at det finnes unntak der to like strenger/objekter kan gi false ved bruk av == og true ved bruk av equals(), men equals() kan altså ikke brukes i det hele tatt på primitive typer som int, boolean og char. Liten pirk: det heter "å deklarere", ikke "å dekalere". Grunnen til at == fungerer på char er som du sier pga det er primitive typer og ikke referanser til objekter. Når man oppretter objekter med new, (Car a = new Car()), vil a bli en referanse til et car objekt. bruker man == på slike referanser vil man sjekke om disse referansene peker til samme objekt, ikke om objektene er like. Feks: Car a = new Car(); Car b = a; System.out.println(a==b); Koden over vil returnere true, da begge referansene peker til samme objekt. Det samme gjelder med primitive typer som char og int. her er inneholder variabelen selve verdien, og ikke en referanse, derfor vil == ha ønsket funksjon, å sjekke om verdiene er like. Lenke til kommentar
srbz Skrevet 9. mars 2011 Del Skrevet 9. mars 2011 Jepp, men dersom du f.eks. kloner objektet av klassen Car: Car a = new Car(); Car b = a.clone(); System.out.println(a==b); så vil du få false, fordi selv om b er en nøyaktig kopi av a, så er ikke b og a det samme objektet. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå