Gå til innhold

Trenger hjelp med innhold i metode


Anbefalte innlegg

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
Videoannonse
Annonse

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 av TSP
Lenke til kommentar

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

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

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

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
  • 3 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...