JAVA < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:28 Fr 18.02.2005 | Autor: | crux |
Hallo,
hab ein Problem mit JAVA... soll eine statische Methode schreiben, mit Parameter des Typs String-Array und Rückgabewert boolean. boolean soll true sein, wenn an einer Stelle des Arrays drei aufeinander folgende Positionen den gleichen String-Inhalt haben.
Mein Lösungsansatz ist:
public static boolean DreiGleicheHintereinander(){
String[]s = {"t", "st", "st", "nm"};
for (int i=0; i<s.length-2;i++){
if (s[i].equals(s[i+1])){
if (s[i].equals(s[i+2]))
System.out.println("true");
return true;
}
}
System.out.println("false");
return false;
}
Bei den meisten Werten funktioniert der Code... aber wenn vor-vorletzes und vorletztes gleich sind, das letzte nicht, gibt es keine Ausgabe... weiß jemand warum? Es scheint in die erste if-schleife reinzugehen und dann abzubrechen... oder so ähnlich... ich hoffe ihr könnt mir helfen...schonmal danke
Ich habe diese Frage in keinem anderen Forum gepostet
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:42 Fr 18.02.2005 | Autor: | crux |
Sobald im String 2 gleiche Werte hintereinander kommen geht es in die erste if-Schleife und bei der 2. if ist es ja falsch- aber warum geht es dann nicht normal mit meiner for-Schleife weiter sondern beendet es? Danke
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:58 Fr 18.02.2005 | Autor: | crux |
habe eben festgestellt, dass ich bei der 2. if schleife die Klammern {} vergessen habe- aber das hinzutun der Klammern löst leider mein Problem nicht... weil es dann anscheinend nicht immer zu einem return befehl kommt... aber warum... wenn bei den if schleifen während der for schleife nie ein true kommt müsste es doch schliesslich zu dem false führen, nachdem die for schleife beendet ist...???
|
|
|
|
|
das hier ist ja dein Programmtext:
public static boolean DreiGleicheHintereinander(){
String[]s = {"t", "st", "st", "nm"};
for (int i=0; i<s.length-2;i++){
if (s[i].equals(s[i+1])){
if (s[i].equals(s[i+2]))
die kommende Anweisung wird ausgeführt wenn true
System.out.println("true");
die kommende Anweisung wird immer wenn das erste if true ist
ausgeführt. Die Funktion wird am Ende der if - Schleife beendet, das soll wohl nicht so sein, eher soll wohl das true erstmal zwischengespeichert werden, bis du durch alle Indices durch bist?
return true;
}
}
System.out.println("false");
return false;
}
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:10 Fr 18.02.2005 | Autor: | crux |
Ja, das Problem ist, das es nach der 2. if Schleife beendet- aber eigentlich ist da ja noch nicht meine for-Schleife zu Ende.,.. warum wird es dann trotzdem beendet? Zunächst war das primäre Problem das Vergessen der Klammer{} aber das hinzufügen hat dazu geführt das nicht immer ein return befehl ausgeführt wird was ich nicht verstehe... wenn die for schleife unerfolgreich (die if-schleifen ergeben nicht true) ausgeführt worden ist, müsste es doch einfach den false wert zurückgeben?!
warum führt es die for schleife nicht weiter aus, nach der 2. if schleife(also wenn die bedingung nicht erfüllt ist)?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:37 Fr 18.02.2005 | Autor: | Marc |
> Ja, das Problem ist, das es nach der 2. if Schleife
> beendet- aber eigentlich ist da ja noch nicht meine
> for-Schleife zu Ende.,.. warum wird es dann trotzdem
> beendet? Zunächst war das primäre Problem das Vergessen der
> Klammer{} aber das hinzufügen hat dazu geführt das nicht
> immer ein return befehl ausgeführt wird was ich nicht
> verstehe... wenn die for schleife unerfolgreich (die
> if-schleifen ergeben nicht true) ausgeführt worden ist,
> müsste es doch einfach den false wert zurückgeben?!
> warum führt es die for schleife nicht weiter aus, nach der
> 2. if schleife(also wenn die bedingung nicht erfüllt
> ist)?
Dein Programm:
1: | public static boolean DreiGleicheHintereinander(){
| 2: | String[]s = {"t", "st", "st", "nm"};
| 3: | for (int i=0; i<s.length-2;i++){
| 4: | if (s[i].equals(s[i+1])){
| 5: | if (s[i].equals(s[i+2]))
| 6: | System.out.println("true");
| 7: | return true;
| 8: |
| 9: | }
| 10: | }
| 11: | System.out.println("false");
| 12: | return false;
| 13: | } |
verbessertes Programm:
1: | public static boolean DreiGleicheHintereinander(){
| 2: | String[]s = {"t", "st", "st", "nm"};
| 3: | for (int i=0; i<s.length-2;i++){
| 4: | if (s[i].equals(s[i+1])){
| 5: | if (s[i].equals(s[i+2])){
| 6: | System.out.println("true");
| 7: | return true;
| 8: | }
| 9: | }
| 10: | }
| 11: | System.out.println("false");
| 12: | return false;
| 13: | } |
Hier habe ich --wie von marthasmith vorgeschlagen-- ein Klammerpaar in Zeile 5 und 8 eingefügt.
Das bewirkt nun, dass die Anweisung in Zeile 7 nur ausgeführt wird, wenn auch die innerste IF-Abfrage erfüllt ist.
Vorher wurde sie nämlich auch ausgeführt, egal ob die innerste IF-Abfrage erfüllt war oder nicht.
Dies ein typischer Fehler (nicht nur bei Java): Nach einer IF-Abfrage wird exakt eine Anweisung oder exakt ein Anweisungsblock ausgeführt. Im ersten Programm war dies nur die Zeile 6, im zweiten Programm sind dies aber (durch die Klammersetzung) die Zeilen 6 und 7.
Viele Grüße,
Marc
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:45 Fr 18.02.2005 | Autor: | crux |
Danke für eure Hilfe- oh man, was so bisschen Klammer immer alles bewirkt ;) jetzt läuft das Ding.
|
|
|
|
|
da ich Java nicht kann :o)
hier einfach ein Pseudocode:
j = 0;
for(i = 0 to i = length(s1-2))
{
if (s1[i] == s2[i] and s1[i] == s2[i+1] and s1[i] == s2[i+2])
index[j++] = i;
}
if( j > 0)
return true;
else
return false;
du hast dann am Ende ein array in dem die Indizes von s1 stehen,
so dass die nächsten beiden Zeichen mit denen aus s2 identisch sind.#
Die Vergleiche musst du jetzt quasi nur noch mit Java Code machen.
|
|
|
|