Char Feld -> "Zeilenumbruch"

Status
Nicht offen für weitere Antworten.
B

Berger345

Gast
Hallo liebe Forummitglieder!

Ich zerreiße mir schon seit stunden den Kopf über meine Programmierhausübung. Folgende Lösung muss ich erstellen:
Implementieren Sie eine Methode void alignText(char[] text, int width), die den im
Parameter text enthaltenen Text linksbündig aligniert in die Konsole ausgibt, wobei
die Spaltenbreite width zu berücksichtigen ist. text enthält Wörter (Folge von
zusammenhängenden Buchstaben) und Leerzeichen, die die Wörter trennen.
Zwischen zwei Wörtern ist genau ein Leerzeichen. Jede Zeile wird bis zu width mit
ganzen Wörtern aufgefüllt. Hat ein Wort nicht mehr Platz, wird es in der nächsten
Zeile ausgedruckt. Ist ein Wort länger als width wird es ohne Trennzeichen
umgebrochen.

Nunja, ich habe schon mehrere verschiedene Versuche gestartet und die, die bisher am "besten" funktioniert hat, stelle ich hier rein:

Code:
public class EPRUE0603 
{
	static void alignText(char[] text, int width)
	{
		int save = width;
		
		char[] temp = new char[text.length];
		int wText = -1;
		
		while(wText < text.length)
		{
			int n = 0; 
			wText +=1;

			while(text[wText+n] != ' ' && text[wText+n] != '.')
			{
				temp[n] = text[wText+n];
				n++;
			}
			
			wText = wText + n;

			if(n <= width)
			{
				print(temp, n);
				width = width - n;
			} else {
				System.out.println(); //Umbruch
				print(temp, n);
				width = save;
			}
			
		}
	}
	
	
	static void print(char[] word, int length)
	{
		for(int i = 0; i < length; i++)
				System.out.print(word[i]);
	}
	
	public static void main(String[] args)
	{
		char[] text = { 
				'I','m','p','l','e','m','e','n','t','i','e','r','e','n',' ',
				'S','i','e',' ','e','i','n','e',' ','M','e','t','h','o','d','e','.' 
		};
		
		
		alignText(text, 6);
	}
}

Hier die Ausgabe der Konsole:
// Umbruch
ImplementierenSie
eine
MethodeException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32
at EPRUE0603.make(EPRUE0603.java:16)
at EPRUE0603.main(EPRUE0603.java:56)


Die Out of Bounce Exception bekommen ich wohl wegen dem Punkt.

Irgendwie funktionierts leider noch nicht ganz. ich wieß nicht, wie ich die Zerlegung eines Wortes, dass länger ist als width bewergstelligen soll. Ich muss ja wissen, wieviel in der nächsten Zeile dann noch übrig ist.

Oder gehe ich das komplett falsch an und sollte alles nochmal neu schreiben? und wenn ja, wie?

Danke im Vorraus!
 

DocRandom

Top Contributor
Moin Berger!

Ich hab mir erlaubt, Deinen Code etwas umzuschleiben.
Hier das Ergebnis:
Code:
package berger345;

public class EPRUE0603 {
   
	static void alignText(char[] text, int width) {
	
		// Indexvariable für das Wort
		int i = 0;
		// Zaehlvariable fuer die Schleife
		int zeichen = 0;
		// Array mit der Laenge von width
		char[] word = new char[width];
		
		// solange es Zeichen gibt
		while( zeichen < text.length) {
			word[i] = text[zeichen];
			i++;
			zeichen++;
			// ist die Wortlänge erreicht?
			if (i == width) {
				i = 0;
				// Wort ausgeben
				System.out.println(word);
				// Wort löschen
				for(int x = 0; x < width; x++) {
					word[x] = ' ';
				}
			}
		}
		// das letze Wort ausgeben, falls vorhanden
		System.out.println(word);
   }
	
   
   public static void main(String[] args)
   {
      char[] text = {
            'I','m','p','l','e','m','e','n','t','i','e','r','e','n',' ',
            'S','i','e',' ','e','i','n','e',' ','M','e','t','h','o','d','e','.'
      };
      
      
      alignText(text, 5);
   }
}

lg
DocRandom
 
B

Berger 234

Gast
Danke für deine Antwort! So eine ähnliche Grundstruktur hatte ich bei meiner ersten Lösung auch, nur darf ich Wörter, die nicht mehr in die Zeile passen, nicht einfach abschneiden, sondern muss sie in die nächste Zeile schreiben (solange das Gesamtwort die Breite (width) nicht im ganzen überschreitet.

Hier mal ein Beispiel zur Veranschaulichung: Breite der Zeile 5
TAKE THE DOG FOR A WALK.

Ausgabe:
TAKE |
THE |
DOG |
FOR A|
WALK.|

| = soll ende der Zeile signalisieren.


Hab das ganze noch einmal geschrieben, nur ein wenig abgeändert und besser kommentiert:

Code:
public class Main {

    static void make(char[] text, int width) {
        int save = width;

        for (int i = 0; i < text.length; i++) { // Durchlaufen des textarrays
            if (wordLength(text, i) <= width) { // Überprüfen, ob die Textlänge kleiner ist als die Zeilenbreite
                printWord(text, i, wordLength(text, i)); // ja: Wort Ausgeben
                width = width - wordLength(text, i); // Zeilenbreite akutallisieren 
                i = i + wordLength(text, i); // Durchlaufindex des textarrays hochzählen (aktueller durchlauf + die wortlänge)
            } else {
                System.out.println(); // nein: zeilenumbruch und ausgabe
                printWord(text, i, (i + wordLength(text, i)));
                width = save; // breite auf ursprüngliche breite setzen
                i = (i + wordLength(text, i)) + 1; // Durchlaufindex des textarrays hochzählen (aktueller durchlauf + die wortlänge) 
            }
        }
    }

    
    /**
     * Wort ausgeben mit Leerzeichen
     */
    static void printWord(char[] text, int idxLow, int idxHigh) {
        while (idxLow < (idxHigh + 1)) {
            System.out.print(text[idxLow]);
            idxLow++;
        }
    }
    
    
    /**
     * Länge des Wortes wird zurückgegeben. 
     */
    static int wordLength(char[] text, int idx) {
        while (text[idx] != ' ') {
            idx++;
        }

        return idx;
    }

    public static void main(String[] args) {
        char[] text = {'I', 'm', 'p', 'l', 'e', 'm', 'e', 'n', 't', 'i', 'e', 'r', 'e', 'n', ' ',
                'S', 'i', 'e', ' ', 'e', 'i', 'n', 'e', ' ', 'M', 'e', 't', 'h', 'o', 'd', 'e', '.'};
        make(text, 15);
    }
}


hier die ausgabe:

run:
Implementieren
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32
at epr.Main.printWord(Main.java:38)
at epr.Main.make(Main.java:28)
at epr.Main.main(Main.java:55)
Sie eine Methode.
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)


Ich hoffe es ist jetzt ein wenig verständlicher. Ich frage mich jedoch, warum das Programm "Sie eine Methode" in eine Zeile ausgiebt, obwohl die Breite 15 schon längst überschritten wurde.

Danke im Vorraus!
 
B

Berger 234

Gast
Ok, nach langem überlegen, bin ich draufgekommen, dass eine Abarbeitung einer Zeile von hinten viel einfacher ist.

Deswegen habe ich deinen Vorschlag noch einmal genauer durchdacht. Ich suche mir jetzt einfach das letzte leerzeichen im array word und lösche alle zeichen, die danach kommen. dabei überprüfe ich, ob das nächste zeichen, im array text auch noch ein leerzeichen ist -> wenn ja, kann ich array word einfach als ganzes ausgeben, wenn nicht, schreibe ich das abgeschnittene in die nächste zeile. (ich passe den index zeichen neu an)

ich schätze mal, dass es im Groben funktioniert, jedoch stimmt meine ausgabe noch nicht 100%. weiß jemand woran das liegen könnte, dass er mir bei "Sie", dass S schreibt, bei "eine" das E aber nicht ausgibt? Bei Methode das gleiche.

run-single:
Imple
menti
eren
Sie
ine
ethod
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32
at epr.EPRUE0603.alignText(EPRUE0603.java:26)
at epr.EPRUE0603.main(EPRUE0603.java:110)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

Danke für eure Hilfe!

Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package epr;

/**
 *
 * @author Berger
 */
public class EPRUE0603 
{
    static void alignText(char[] text, int width) 
    {
        // Zaehlvariable fuer die Schleife
        int zeichen = 0;
        // Array mit der Laenge von width
        char[] word = new char[width];

        // solange es Zeichen gibt
        while (zeichen < text.length) 
        {
            for(int n = 0; n < word.length; n++) { // array word ganz auffüllen
                word[n] = text[zeichen];
                zeichen++;
            }

                if(searchLastSpace(word) != -1) // das array wird von hinten nach leerzeichen durchsucht und gibt die position des letzten leerzeichen aus
                {
                    if(text[zeichen] == ' ') // im array text, wird überprüft, ob das nächste zeichen ein leerzeichen ist
                    {
                        System.out.println(word); // wenn ja, dann kann das array word einfach im ganzen ausgegeben werden
                    } else {
                        System.out.println(deletePartsOfArray(word, searchLastSpace(word), word.length)); // wenn nein, werden die letzten zeichen bis zum leerzeichen abgeschnitten
                        zeichen = zeichen + (word.length - searchLastSpace(word)); // wieviele zeichen wurden abgehackt? idx zeichen des array text wird angepasst
                    }
                } else {
                    System.out.println(word);
                }
                
                // Wort löschen
                for (int x = 0; x < width; x++) 
                {
                    word[x] = ' ';
                }
        }
        // das letze Wort ausgeben, falls vorhanden
        System.out.println(word);
    }

    
    /**
     * looks for last space in current row. if found it returns the position of the space
     * if not it returns a negative value: -1
     * @param word saves the characters of current row int text
     * @return
     */
    static int searchLastSpace(char[] word) 
    {
        for(int i = word.length; i > 0; i--)
        {
            if(word[i-1] == ' ')
                return i;
        }
        
        return -1; // if no space found
    }
    
    
    /**
     * delets all characters after the final space
     * @param word
     * @param lowerRange
     * @param higherRange
     * @return
     */
    static char[] deletePartsOfArray(char[] word, int lowerRange, int higherRange)
    {
        while(lowerRange < higherRange)
        {
            word[higherRange-1] = ' ';
            higherRange--;
        }
        
        return word;
    }

    public static void main(String[] args) {
        char[] text = {'I', 'm', 'p', 'l', 'e', 'm', 'e', 'n', 't', 'i', 'e', 'r', 'e', 'n', ' ',
                'S', 'i', 'e', ' ', 'e', 'i', 'n', 'e', ' ', 'M', 'e', 't', 'h', 'o', 'd', 'e', '.'};

        alignText(text, 5);
    }
}
 
G

Gast

Gast
weiß keiner von euch wo der hund begraben ist? morgen wäre mein abgabetermin, also wäre ich über jede hilfe dankbar!
 
S

SlaterB

Gast
der Fehler ist doch einfach zu finden, du suchst dir die Zeile mit der Exception und schaust dir an was dort passiert,
ArrayIndexOutOfBoundsException verrät dir schon, dass es um einen Index geht,

schnell siehst du, dass du 5 Zeichen aus Text in Word schreibst,
aber ist doch denkbar, dass nur noch 1-4 Zeichen da sind

hier eine zumindest für dein Beispiel funktionierende Variante, an mehreren Stellen vereinfacht:

Code:
public class EPRUE0603
{
    static void alignText(char[] text, int width)
    {
        // Zaehlvariable fuer die Schleife
        int zeichen = 0;
        // Array mit der Laenge von width
        char[] word = new char[width];

        // solange es Zeichen gibt
        while (zeichen < text.length)
        {
            for (int n = 0; n < word.length; n++)
            {
                word[n] = ' ';
            }
            int max = Math.min(text.length - zeichen, word.length);
            for (int n = 0; n < max; n++)
            {
                word[n] = text[zeichen];
                zeichen++;
            }

            int lastSpace = searchLastSpace(word);
            if (lastSpace == -1 || zeichen == text.length || text[zeichen] == ' ')
            {
                System.out.println(word);
            }
            else
            {
                deletePartsOfArray(word, lastSpace);
                zeichen = zeichen - word.length + lastSpace;
                System.out.println(word);
            }

            // Wort löschen
            for (int x = 0; x < width; x++)
            {
                word[x] = ' ';
            }
        }
        // das letze Wort ausgeben, falls vorhanden
        System.out.println(word);
    }

    /**
     * looks for last space in current row. if found it returns the position of the space
     * if not it returns a negative value: -1
     * 
     * @param word
     *            saves the characters of current row int text
     * @return
     */
    static int searchLastSpace(char[] word)
    {
        for (int i = word.length; i > 0; i--)
        {
            if (word[i - 1] == ' ') return i;
        }

        return -1; // if no space found
    }

    static void deletePartsOfArray(char[] word, int lowerRange)
    {
        for (int i = lowerRange; i < word.length; i++)
        {
            word[lowerRange] = ' ';
        }
    }

    public static void main(String[] args)
    {
        char[] text =
            {'I', 'm', 'p', 'l', 'e', 'm', 'e', 'n', 't', 'i', 'e', 'r', 'e', 'n', ' ', 'S', 'i', 'e', ' ', 'e', 'i', 'n', 'e',
             ' ', 'M', 'e', 't', 'h', 'o', 'd', 'e', '.'};

        alignText(text, 5);
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M wie auf ein feld mit leerzeichen in einem char array prüfen? Java Basics - Anfänger-Themen 4
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
D 2D Char Array into String Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
Tommilee Char ausgeben Java Basics - Anfänger-Themen 5
M error: '.class' expected switch(char) Java Basics - Anfänger-Themen 32
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
C String/Char-API Java Basics - Anfänger-Themen 13
U Char zu einem String machen Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
W char über die Konsole? Java Basics - Anfänger-Themen 7
C char c Java Basics - Anfänger-Themen 13
D String und char in String speichern Java Basics - Anfänger-Themen 5
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
S zweidimensionale char arrays Java Basics - Anfänger-Themen 14
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
P Methoden Namen trennen mit .substring(), char.At(), .lenght() Java Basics - Anfänger-Themen 8
Z Char Array an zufälligen stellen mit einem "x" füllen. Java Basics - Anfänger-Themen 4
A Datentyp char Java Basics - Anfänger-Themen 27
A Char und modulo Java Basics - Anfänger-Themen 8
A char array wird überschrieben Java Basics - Anfänger-Themen 6
F Switch case wird als char nicht erkannt.... Java Basics - Anfänger-Themen 6
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
I Methoden char Array Aufgabe (bitte hierbei um Hilfe) Java Basics - Anfänger-Themen 3
D Datentypen Char deklaration Java Basics - Anfänger-Themen 4
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
I char Array to String Java Basics - Anfänger-Themen 3
C (char) Array einlesen Java Basics - Anfänger-Themen 8
J Java char.at() Probelm Java Basics - Anfänger-Themen 12
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
H char-Array Java Basics - Anfänger-Themen 22
M Die länge von char Java Basics - Anfänger-Themen 6
T Methoden char wird nicht ausgegeben Java Basics - Anfänger-Themen 3
R Fehler bei ASCII Char zu Int Umwandlung Java Basics - Anfänger-Themen 2
C Methoden String in char Array Java Basics - Anfänger-Themen 3
T Datentypen char als Buchstaben statt als Zahl ausgeben Java Basics - Anfänger-Themen 4
kokojamboo92 char mehrfach ausgeben.. Java Basics - Anfänger-Themen 2
T Erste Schritte Char 'Anführungszeichen' Tastaturkürzel Java Basics - Anfänger-Themen 1
H Compiler-Fehler Out of Bunce Exception bei einem Char Java Basics - Anfänger-Themen 6
E Wie wird in Java ein Char-Array terminiert ? Java Basics - Anfänger-Themen 15
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
C Compiler-Fehler from int to char Java Basics - Anfänger-Themen 2
A Methoden Char-Arrays auf aufeinanderfolgende Elemente vergleichen! Java Basics - Anfänger-Themen 7
T Object zu Char zu String Java Basics - Anfänger-Themen 6
W Char Array bearbeiten Java Basics - Anfänger-Themen 6
A Char-Array erstellen Java Basics - Anfänger-Themen 35
D Hilfe bei int wert von char Java Basics - Anfänger-Themen 7
W String auf char[] umwandeln Java Basics - Anfänger-Themen 3
Z char Array unbekanntes Zeichen selbstständig anlegen Java Basics - Anfänger-Themen 6
M Bestimmen, wie oft ein Char in einem Array vorkommt Java Basics - Anfänger-Themen 2
BuTTerBroTHDx Char Wert in int casten ? Java Basics - Anfänger-Themen 4
D Variablen Variable char vergleichen Java Basics - Anfänger-Themen 5
A Probleme beim Methodenaufruf von char[] ! Java Basics - Anfänger-Themen 10
C char array-positionstausch Java Basics - Anfänger-Themen 6
R Anzahl von Zeichen in einem Char Array Java Basics - Anfänger-Themen 4
C String-zaehleZeichen(String str,char[]c) Java Basics - Anfänger-Themen 9
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
D Best Practice String aufbau - Char Array oder Anhängen Java Basics - Anfänger-Themen 11
S For Schleife Char Array Java Basics - Anfänger-Themen 1
V char Eingabe aber nur für Buchstaben Java Basics - Anfänger-Themen 4
K PasswordField auslesen und in char speichern Java Basics - Anfänger-Themen 2
L Frage zum Zeichensatz Char Java Basics - Anfänger-Themen 2
L Frage zum Typ Char (Zeichensatz) Java Basics - Anfänger-Themen 8
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
P Char aus einem String auswählen Java Basics - Anfänger-Themen 4
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
B char Array mit ints Java Basics - Anfänger-Themen 7
F Char in Long umwandeln? Java Basics - Anfänger-Themen 2
J Char-Array - NullPointerException Java Basics - Anfänger-Themen 3
X Compiler-Fehler Possible loss of precision bei addition von int und char Java Basics - Anfänger-Themen 5
J char-Array rückwärts ausgeben und in neues Char-Array speichern Java Basics - Anfänger-Themen 3
D Methode die statt char[] ein "null" zurück gibt Java Basics - Anfänger-Themen 8
P Methoden suche funktion die char wert ausgibt wenn man numerischen wert und radix angibt Java Basics - Anfänger-Themen 1
R Char wird in System.out.print(); nicht ausgegeben Java Basics - Anfänger-Themen 6
J Char-Rechnen Java Basics - Anfänger-Themen 8
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
S Array - index von Benutzer eingegebenen char ausgeben Java Basics - Anfänger-Themen 3
M char Array füllen Java Basics - Anfänger-Themen 2
H ArrayList mit char- Array befüllen Java Basics - Anfänger-Themen 12
S überschneidende Char-Arrays, zu einem Längeren verbinden Java Basics - Anfänger-Themen 7
M Warum ist char a + char b 196 Java Basics - Anfänger-Themen 4
J Datentypen Cast von int zu char führ zu 'Sonderzeichen' Java Basics - Anfänger-Themen 2
M Erste Schritte konvertierung von int zu char Java Basics - Anfänger-Themen 3
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
A Char Bytes Umwandlung und Darstellung Java Basics - Anfänger-Themen 3
R Input/Output einzelnes char aus .txt lesen Java Basics - Anfänger-Themen 11
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
M String in char-weise vergleichen und ausgeben Java Basics - Anfänger-Themen 5
V while verlassen, char Java Basics - Anfänger-Themen 2
S Datentypen Ein String in ein Char und ein Double wandeln Java Basics - Anfänger-Themen 2
A Char to String Java Basics - Anfänger-Themen 5
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
W Char als Int speichern Java Basics - Anfänger-Themen 10
W Variablen Rechnen mit "char" Java Basics - Anfänger-Themen 2
G Char und Strings Java Basics - Anfänger-Themen 21

Ähnliche Java Themen

Neue Themen


Oben