Wiederholte Ausgabe vermeiden

Diskutiere Wiederholte Ausgabe vermeiden im Java Basics - Anfänger-Themen Bereich.
A

abx912

Hallo zusammen!
Habe mich hier gerade erst angemeldet also bitte gnädig sein, falls ich mich undeutlich formuliere oder im falschen Unterforum bin!

Zu meinem Problem:
Ich habe eine Methode, die einen String spaltet und bei jedem Aufruf, den nächsten Teilstring ausgibt.
Als Beispiel: Wenn meine ursprüngliche Eingabe "a b c d e " ist, soll beim ersten Aufruf erst "a" ausgegeben werden, beim nächsten Aufruf "b" usw. bis mein letzter Aufruf "e" ausgibt. Es sollen auch beliebig viele Leerzeichen am Anfang, Ende und zwischendrin verarbeitet werden.

(Ich sehe gerade bei der Vorschau, dass etwas nicht übernommen wurde: In der Eingabe befinden sich mehrere Leerzeichen zwischen den Buchstaben und nach dem "e")

Meine Methode macht all das, bis auf eines: Wenn ich bei meiner letzten Ausgabe angekommen bin, also hier das "e", dann wird bei jeder weiteren Ausgabe immer das "e" ausgegeben.
Meine Methode sieht wie folgt aus:

Java:
public String ausgabe () {

        text=text.trim();
        
        String [] Split = text.split(" ");
        
            for (int i=0; i<Split.length;){
                System.out.println(Split[i]);
                text=text.substring(text.indexOf(" ")+1);               
                break;
            }
        return text;
            
    }
Meine Ausgabe ist dementsprechend:
Java:
a
b
c
d
e
e //ab hier wiederholt sich die Ausgabe, sobald ich die Methode weiter aufrufe
e
e
e
Ich hätte gerne, dass nachdem das "e" ausgegeben wurde, nichts mehr ausgegeben wird. Oder ich dementsprechend etwas einbauen kann wie "keine Zeichen" o.ä.
Ich hab schon rausgelesen, dass Java entsprechende Methoden hat, aber alles spaßige aus java.util ist natürlich nicht erlaubt zu benutzen ;)
 
T

temi

Nur zum Verständnis:

Die Methode ausgabe() wird von dir mehrfach aus der main() aufgerufen?

Sie soll bei jedem Aufruf ein einzelnes Zeichen, beginnend mit dem ersten Zeichen und endend mit dem Letzen, unter Auslassung der Leerzeichen, ausgeben?

Ist das (so ungefähr) der Wortlaut der Aufgabe?

Edit: Dazu musst du ja den gegebenen String immer entsprechend kürzen (oder du merkst dir irgendwo, welche Position die letzte gewesen ist). Am einfachsten wäre es beim ersten Zeichen zu beginnen, es auszugeben und dann aus dem String zu entfernen. Nach dem letzten ausgegebenen Zeichen ist nichts mehr da, was ausgegeben werden könnte. Leerzeichen können jeweils direkt entfernt werden.

Edit2: Falls du sie "in einem Rutsch" ausgeben möchtest, dann geht das recht einfach.
Code:
Initialisiere i mit 0.
Solange i kleiner ist als die Länge des Strings:
    Setze Zeichen c gleich dem i-ten Zeichen des Strings
    Wenn c keine Leerzeichen ist, dann gebe c aus
    Erhöhe i um eins.
Das i-te Zeichen im String erhältst du mittels charAt().
 
Zuletzt bearbeitet:
A

abx912

Laut Aufgabe soll die Methode "das nächste Zeichen oder, falls keine Zeichen mehr vorliegen, null ausgeben". Im allgemeinen Aufgabentext steht noch "üblicherweise werden nicht direkt alle Zeichen zurück gegeben, sondern nach Aufforderung das jeweils nächste".

Und ja, ich rufe in der Main manuell die Methode auf, also keine for-schleife oder ähnliches. Obwohl ich das auch schon versucht habe, allerdings ändert das meine Ausgabe nicht sonderlich.

Bei zB. einem String aus insgesamt 3 Zeichen, ("hallo 3a w35fb"), rufe ich ausgabe() 3 (bzw 4) mal auf und sollte dann nacheinander
-hallo (als erste Ausgabe)
[zB Aufruf von einer anderen Methode um die Länge des Reststrings zu bestimmen]
-3a (zweiter Aufruf von ausgabe())
-w35fb (dritter Aufruf von ausgabe())
- null (als vierter Aufruf von ausgabe())
ausgeben.

Leerzeichen sollen ignoriert/gelöscht/nicht beachtet/nicht ausgegeben werde. Deswegen das Löschen durch .trim() und Splitten des Strings an den Leerzeichen.
 
T

temi

text=text.substring(text.indexOf(" ")+1);
Das Problem liegt hier. Das funktioniert nicht zuverlässig.

Einfacher wäre es, wenn du auf split() verzichtest und mittels charAt() auf die Zeichen zugreifst. Dann überlege dir wie viele Zeichen du jeweils mit substring() am Anfang abschneiden musst.

Zum Beispiel: " a b "

Bei ersten Aufruf wird "a" ausgegeben und zwei Zeichen müssen entfernt werden " a".
Beim zweiten Aufruf wird "b" ausgegeben und ein Zeichen muss entfernt werden "b".
Beim dritten Aufruf wird nichts ausgegeben und das letzte Leerzeichen entfernt.
String ist jetzt leer.
 
A

abx912

Das würde dann aber nur funktionieren, wenn ich die Eingabe kenne oder ?
Ich teste das zwar an meinem eigenen Beispiel, wollte es aber ursprünglich allgemeiner halten.
 
T

temi

Das würde dann aber nur funktionieren, wenn ich die Eingabe kenne oder ?
Das wäre nicht gut.

Meine Version davon liefert folgendes Ergebnis:
Java:
        String str = "a b       c d e ";

        str = ausgabe(str);
        System.out.println(str);

        str = ausgabe(str);
        System.out.println(str);

        str = ausgabe(str);
        System.out.println(str);

        str = ausgabe(str);
        System.out.println(str);

        str = ausgabe(str);
        System.out.println(str);

        str = ausgabe(str);
        System.out.println(str);
Ausgabe
Code:
a
b       c d e
b
       c d e
c
d e
d
e
e
null
null
 
Zuletzt bearbeitet:
A

abx912

Also wenn ich mit charAt() rumprobiere, kriege ich im besten Fall nur die einzelnen Buchstaben ausgegeben und im schlechtesten Fall eine Fehlermeldung.
Auch wenn der String aus Worten besteht, werden die Worte aufgeteilt.
Aus zB. "hallo" wird dann
h
a
l
l
o

Wenn ich split() weglasse, ich dann nicht mehr über den Split-Array, sondern über text.length() ?
Und wie oben gesagt, greife ich mit charAt() nur auf einzelne Buchstaben zu. Muss ich das zwischendurch noch in nem neuen String speichern, damit ich am Ende das Wort kriege ?
 
T

temi

Also wenn ich mit charAt() rumprobiere, kriege ich im besten Fall nur die einzelnen Buchstaben ausgegeben und im schlechtesten Fall eine Fehlermeldung.
Auch wenn der String aus Worten besteht, werden die Worte aufgeteilt.
Aus zB. "hallo" wird dann
h
a
l
l
o

Wenn ich split() weglasse, ich dann nicht mehr über den Split-Array, sondern über text.length() ?
Und wie oben gesagt, greife ich mit charAt() nur auf einzelne Buchstaben zu. Muss ich das zwischendurch noch in nem neuen String speichern, damit ich am Ende das Wort kriege ?
Dann habe ich dich wohl mißverstanden. Ich dachte du sollst die Buchstaben, bis auf die Leerzeichen, einzeln ausgeben. Sorry!

Aus der bisherigen Beschreibung der Aufgabe war das für mich nicht ersichtlich.
Laut Aufgabe soll die Methode "das nächste Zeichen oder, falls keine Zeichen mehr vorliegen, null ausgeben"
Das klingt für mich wie ein einzelnes Zeichen.
 
A

abx912

Bei zB. einem String aus insgesamt 3 Zeichen, ("hallo 3a w35fb"), rufe ich ausgabe() 3 (bzw 4) mal auf und sollte dann nacheinander
-hallo (als erste Ausgabe)
[zB Aufruf von einer anderen Methode um die Länge des Reststrings zu bestimmen]
-3a (zweiter Aufruf von ausgabe())
-w35fb (dritter Aufruf von ausgabe())
- null (als vierter Aufruf von ausgabe())
ausgeben.
Ne entschuldige, dann hab ich mich falsch ausgedrückt.
Das sollte so wie in dem Beispiel hier sein. Also die Einzelnen Elemente eines Strings jeweils ausgeben. Nicht Buchstabe für Buchstabe, sondern "Stringteil" für "Stringteil".

Für einen Eingabestring "a bb c" jeweils pro Aufruf "a", "bb", "c"
Für einen Eingabestring "1 vbhj 56 G TULPE", jeweils pro Aufruf "1", "vbhj", "56", "G", "TULPE"
Und dann entsprechend mit wilder Anzahl an Leerzeichen im String.
 
MoxxiManagarm

MoxxiManagarm

Für mich klingt die Aufgabenstellung nach einem Iterator, der Scanner ist übrigens auch einer, falls der erlaubt ist

Edit: Zu spät gesehen, dass util wieder nicht erlaubt ist ;-)
 
Zuletzt bearbeitet:
A

abx912

Ich glaub, wenn java.util erlaubt wäre, wäre die Aufgabe an sich etwas witzlos :D Also für mich nicht, ich hätte nichts dagegen gehabt, wenn man meine Programmierkenntnisse bedenkt, aber von Seiten des Dozenten und wahrscheinlich für jemanden, der Programmieren kann.

Danke trotzdem für die Hilfe hier! Habe mir nicht zu große Hoffnungen gemacht, dass es auf die schnelle gelöst wird. Das Programm läuft (ein Wunder an sich und ein Erfolg für mich!!), bis eben auf diese kleine Sache. Ich nenne sie mal "Schönheitsfehler".
 
Zuletzt bearbeitet:
mihe7

mihe7

Die Idee an sich ist ja nicht schlecht, Du musst halt beachten, dass indexOf() den Wert -1 liefert, wenn das gesuchte Zeichen nicht im String enthalten ist.
 
A

abx912

Die Idee an sich ist ja nicht schlecht, Du musst halt beachten, dass indexOf() den Wert -1 liefert, wenn das gesuchte Zeichen nicht im String enthalten ist.
Auch wenn der Eingabestring nur "hallo" enthält, komplett ohne Leerzeichen und weitere Wörter oder Elemente, wird bei jedem Aufruf "hallo" ausgegeben, ohne Fehlermeldung.

Es könnte auch noch Probleme geben, wenn mehrere Leerzeichen hintereinander im String sind.
Genau das ist Teil der Aufgabe und es gibt auch mehrere Leerzeichen in der Eingabe, die werden aber ohne Probleme verarbeitet.
Auch wenn die Eingabe nur aus Leerzeichen besteht, gibt es dann quasi ne leere Ausgabe, aber keine Fehlermeldung

Vielleicht nochmal zur Verdeutlichung:
Das soll die Methode machen.
Code:
Eingabe als String: "  da s ist   ein BEIspiel  ! 4     "
Dann soll bei jedem (manuellen) Aufruf der Methode folgendes ausgegeben werden:
da
s
ist
ein
Bsp
!
4
null
null
null
Wenn man bzw. ich die Methode von oben so ausführt wie sie ist, gibt es keine "Probleme" oder Fehlermeldungen, aber eben folgende Ausgabe:
Code:
Eingabe als String: "  da s ist   ein BEIspiel  ! 4     "
Ausgabe:
da
s
ist
ein
Bsp
!
4
4 //ab hier ist mein Problem, denn hier und in den weiteren Ausgaben
4 //sollte null stehen
4
4
4
 
A

abx912

Genau das ist es. Dieses letzte Element bleibt, was immer das auch sein mag.
Bei längeren Eingaben wird er kleiner, aber eben nicht komplett leer. Daher bleibt diese Ausgabe des letzten/einziges Elements.

Da mein Beispiel mehrere Elemente enthält und bei jedem Aufruf kleiner wird, habe ich zuerst angenommen, dass die Methode korrekt funktioniert, bis ich bei der letzten Ausgabe nicht weitergekommen bin. Habe zuerst gedacht ich müsste eine Fehlermeldung kriegen, weil ich beim letzten Update von "text" mit substring quasi was nicht vorhandenes in "text" kopiere, aber er scheint entweder nichts zu machen oder eben sich selber zu kopieren.
 
mihe7

mihe7

Überleg doch mal, welche Möglichkeiten es gibt.

1. Der String ist leer, dann sollst Du null ausgeben.
2. Ansonsten gibt es zwei Fälle:
2.1 Es gibt ein Leerzeichen im String -> neuer Text = nach dem Leerzeichen
2.2 Es gibt kein Leerzeichen im String -> neuer Text ist leerer String
 
Thema: 

Wiederholte Ausgabe vermeiden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben