Java Methode; true wenn char zweimal auftaucht?


22.12.2019, 14:45

Habe es teils gelöst, aber habe eine zusätzliche Frage; wie kann ich es so gestalten, dass es auch klappt wenn 2 Buchstaben genau 2 mal vorkommen wie z.B. : Trierer.

Hier kommt e zweimal vor, also sollte es eigentlich true sein, aber weil das r 3 mal vorkommt ist gilt es als falsch.

3 Antworten

Dann überlegmal was beim String Hello passieren würde.

Das H würde einmal gezählt werden, weil die innere Schleife ja das H zu beginn zählt. Das e ebenso und das o auch. Haben wir also den Zählerstand 3 und jetzt die beiden l.

Das erste l wird zweimal gezählt und das zweite l ebenso ergibt insgesamt 7.

Damit das geht was du willst musst du bereits geprüfte Chars überspringen und dann ist noch die Frage was soll der String oohh ergeben, soll das 4 sein und damit false oder auch true?

takethem 
Fragesteller
 22.12.2019, 14:46

Genau du hast vollkommen recht. Wie kann ich Fälle wie z.B. aabbb lösen? Das sollte eigentlich true sein, da a 2 mal vorkommt, ist jedoch false wegen dem 3 mal b

0
PeterKremsner  22.12.2019, 14:54
@takethem

Du kannst alle Buchstaben darin durchgehen.

Sprich du prüfst wie viele a sind drinnen und wenn da genau 2 drinnen sein direkt return true. Wenn du mit den b Anfängst zählst du diese und du siehst 3 b, in dem Fall continue und dann siehst du die zwei a und kommst wieder zu deinem return true.

Nur wenn deine Schleife niemals true zurückgibt gibst du am Ende der Funktion false zurück.

In einem Pseudocode wär das also

List exception;
for(i = 0; i < str.len; i++){
   char charakter = str.charAt(i);
   if(exception.Contains(charakter))
      continue;
   if(str.ZähleBuchstaben(charakter) == 2)
     return true;
   exception.Add(charakter);
}
return false;

So prüfst du jeden Char im String nur einmal und nicht mehrmals und sobald einer doppelt ist gibst du true zurück.

Die Methode zähleBuchstaben musst du dir hald noch überlegen ist aber nicht sonderlich schwer. Btw du kannst die Prüfung ob du den Buchstaben schon mal hattest auch weglassen es sollte in diesem Code egal sein, ob du einen Buchstaben mehrmals prüfst, es kann höchstens langsamer sein, als das Pürfen ob der Buchstabe in der Liste ist.

1
takethem 
Fragesteller
 22.12.2019, 14:57
@PeterKremsner

Vielen Dank! Habe diese commands zwar noch nicht in der Vorlesung gehabt aber werde es mir jetzt anschauen

0
PeterKremsner  22.12.2019, 15:01
@takethem

Das ist wie gesagt Pseudocode und kein wirkliches Java. Du sollst nur lesen können wie es in etwa aussieht. Die Methode ZähleBuchstaben gibts ja zB nicht und eine List gibts in Java auch nicht, da musst du eben etwas in Java finden was dem am nächsten kommt.

Aber wie gesagt du kannst die Liste auch komplett weg lassen.

1
takethem 
Fragesteller
 22.12.2019, 15:34
@PeterKremsner

Hab es gemacht und es klappt ! Jedoch klappen jetzt Fälle wie z.B. lalelu nicht mehr, da der eine Buchstabe l drei mal vorkommt, aber mein Programm schon bei 2 l's return true ausgibt. :/

0
PeterKremsner  22.12.2019, 17:53
@takethem

Dann hast du die Methode zum zählen der Buchstaben falsch implementiert.

Mach diese Funktion einfach so:

int CharCount(string str, char toCount){
    int counter = 0;
    for(int i = 0; i < str.length(); i++)
    {
       if(str.charAt(i) == toCount)
          counter++;
    }

    return counter;
}

In diesem Fall gibt diese Methode bei dem String lalelu für den Buchstaben l 3 zurück und damit ist Abbbruchbedingung in meinem Pseudocode oben nicht erfüllt, womit hier nicht true zurückgegeben wird.

1
takethem 
Fragesteller
 22.12.2019, 18:12
@PeterKremsner

Oh man. Danke! Es funktioniert. Tut mir Leid dich mit so dummen Fehlern genervt zu haben, aber danke!

1
idontlikeit  22.12.2019, 18:43
@takethem

Ich hätte da noch einen Vorschlag für die Auswertung des counters:

return counter == 2;

Das wäre kürzer und eleganter :)

Außerdem sind die Einrückungen falsch und die {} kannst du bei Einzeilern einfach weglassen

1

für alle Positionen ab 1 aufwärts vergleichst Du auch immer die Pos mit sich selbst, counter wird daher viel zu groß.

j darf nicht bei 1 loslaufen, sondern bei i+1.

takethem 
Fragesteller
 22.12.2019, 14:41

Yep, kam auch grade drauf. Und ich muss den Counter auf 1 setzen nicht auf 0

0

Es ergibt immer true weil s.charAt(1) == s.charAt(1). (i, j = 1)

Woher ich das weiß:Studium / Ausbildung – Informatikstudium