String teilen in gleich große strings

turmaline

Bekanntes Mitglied
Hallo Leute,

kennt Ihr eine schlaue Bibliothek für Strings, die mir ermöglichen würde, ein string in n-große Strings zu teilen und dabei den String früher zu brechen, wenn da ein Leerzeichne vorgekommen ist.

So sieht es bei mir aus, aber vielleicht gibt es da Fehler die ich nicht sehe, bzw. ich das Rad neu erfunden habe... Oder vielleicht kann man das einfacher/perfomanter machen? Habt Ihr Ideen?

Java:
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;


public class StringUtils 
{
	private final static Logger LOGGER = Logger.getLogger(StringUtils.class .getName());

	public static List<String> getSubStrings(String text, int n) 
	{
		List<String> list = new ArrayList<String>();
		String s = new String(text);
		while(s.length() != 0)
		{
			s = s.trim();
			int end = n < s.length() ? n : s.length();
			String sub = s.substring(0, end);
			int nextIndex = end;
			int lastIndexOfSpace = sub.lastIndexOf(" "); // index of space character
			if(lastIndexOfSpace > 0)
			{
				end = lastIndexOfSpace;
				sub = s.substring(0, end);
				nextIndex = end + 1;
			}
			
			list.add(sub);
			s = s.substring(nextIndex);
		}
		LOGGER.info(text);
		LOGGER.info(list.toString());
		return list;
	}

}

und die Testklasse dazu:

Java:
import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;


public class SimpleTestCase 
{

	@Test
	public void test() 
	{
		String text = "lalalla lalall ll lalal lallalhzh";
		int n = 5;
		List<String> list = StringUtils.getSubStrings(text, n);
		assertEquals(7, list.size());
	}

}

Her mit Ideen ;)

Danke und Gruß,

madlena
 
S

Spacerat

Gast
Als erstes [c]new StringBuilder(completeString);[/c] und dann darauf die ganzen [c]substring()[/c] Methoden aufrufen. Vorher evtl. noch alle Leerzeichen daraus entfernen.
 

Paddelpirat

Bekanntes Mitglied
Java:
            int lastIndexOfSpace = sub.lastIndexOf(" "); // index of space character
            if(lastIndexOfSpace > 0)
            {
                end = lastIndexOfSpace;
                sub = s.substring(0, end);
                nextIndex = end + 1;
            }

Der Teil ist bei dir wohl recht nutzlos, da du vorher sagst:
Code:
s=s.trim()
 

xehpuk

Top Contributor
Wieso ist der Teil nutzlos?

Ich stand auch mal vor der Problemstellung und habe mir etwas selbst geschrieben.

Java:
public final class Util {
	public final static String NEW_LINE = System.getProperty("line.separator");
	public final static char SPACE = ' ';
	public final static char ELLIPSIS = '\u2026';

	private Util() {}

	/**
	 * Gibt einen Text umbrochen aus.
	 * Beruecksichtigt wird, dass Woerter moeglichst nicht umbrochen werden.
	 * Als Trennzeichen wird nur das normale Leerzeichen (<tt>\u0020</tt>) erkannt.
	 * Passt der Text nicht in die angegebene Zeilenanzahl, so wird dies durch Auslassungspunkte (<tt>\u2026</tt>) am Ende gekennzeichnet.
	 * @param toWrap Der zuumbrechende Text.
	 * @param maxChars Die maximale Anzahl an Zeichen pro Zeile.
	 * @param maxLines Die maximale Anzahl an Zeilen, die der umbrochene Text haben soll.
	 * @return Den umbrochenen Text oder <tt>null</tt>, wenn <tt>toWrap == null</tt>.
	 * @throws IllegalArgumentException Wenn <tt>maxChars <= 0</tt>.
	 */
	public static String wrap(final String toWrap, final int maxChars, final int maxLines) {
		if (maxChars <= 0)
			throw new IllegalArgumentException("maxChars was " + maxChars + " but must be > 0");
		if (toWrap == null)
			return null;
		final String[] words = toWrap.split(SPACE + "+");
		final StringBuilder builder = new StringBuilder();
		int lineLength = 0;
		int lineNumber = 0;
		for (int i = 0; i < words.length; i++) {
			if (lineLength == maxChars) {
				if (lineNumber < maxLines - 1) {
					builder.append(NEW_LINE);
					lineNumber++;
					lineLength = 0;
				} else {
					builder.deleteCharAt(builder.length() - 1);
					builder.append(ELLIPSIS);
					break;
				}
			}
			final String currentWord = words[i];
			final int wordLength = currentWord.length();
			if (wordLength + lineLength < maxChars) {
				if (lineLength != 0) {
					builder.append(SPACE);
					lineLength++;
				}
				builder.append(currentWord);
				lineLength += wordLength;
			} else {
				if (lineLength == 0) {
					if (wordLength == maxChars) {
						builder.append(currentWord);
						lineLength = wordLength;
					} else {
						builder.append(currentWord.substring(0, maxChars));
						words[i] = currentWord.substring(maxChars);
						lineLength = maxChars;
						i--;
					}
				} else {
					if (wordLength <= maxChars) {
						if (lineNumber < maxLines - 1) {
							builder.append(NEW_LINE);
							lineNumber++;
							builder.append(currentWord);
							lineLength = wordLength;
						} else {
							final int difference = maxChars - lineLength;
							if (difference > 1) {
								builder.append(SPACE);
								builder.append(currentWord.substring(0, maxChars - lineLength - 2));
							}
							builder.append(ELLIPSIS);
							break;
						}
					} else {
						if (maxChars - lineLength > 1) {
							builder.append(SPACE);
							lineLength++;
							final int cutIndex = maxChars - lineLength;
							builder.append(currentWord.substring(0, cutIndex));
							words[i] = currentWord.substring(cutIndex);
						}
						lineLength = maxChars;
						i--;
					}
				}
			}
		}
		return builder.toString();
	}
}
Ist schon recht viel Code für so eine kleine Aufgabe. Geht bestimmt auch kürzer.

Gibt auch einen String zurück und nicht eine Liste. Aber vielleicht hilfts ja weiter.

Testfälle gibts auch, nur hätten diese die maximale Zeichenanzahl pro Beitrag gesprengt. :noe:
Falls daran Interesse besteht, kann ich sie in einem weiteren Beitrag ergänzen.
 

turmaline

Bekanntes Mitglied
Einen kleinen Fehler habe ich bei mir gefunden, das mit Leerzeichne ist natürlich nur dann relevant, wenn die Stringlänge größer als n ist.

Java:
public static List<String> getSubStrings(String text, int n) 
    {
		 List<String> list = new ArrayList<String>();
	        String s = new String(text);
	        while(s.length() != 0)
	        {
	            s = s.trim();
	            int end = n < s.length() ? n : s.length();
	            String sub = s.substring(0, end);
	            int nextIndex = end;
	            int lastIndexOfSpace = sub.lastIndexOf(" "); // index of space character
	            if(n < s.length() && lastIndexOfSpace > 0)
	            {
	                end = lastIndexOfSpace;
	                sub = s.substring(0, end);
	                nextIndex = end + 1;
	            }
	            
	            list.add(sub);
	            s = s.substring(nextIndex);
	        }
	        return list;
    }

Oder sieht Ihr noch andere Probleme? Bitte posten.
 
S

Spacerat

Gast
In StringBuilder gibt es die Methode [c]deleteCharAt()[/c]. Damit lassen sich relativ einfach alle überflüssigen Whithespaces zwischen den Wörtern entfernen - würde andauerndes [c]trim()[/c] ersetzen. Die Methode [c]substring()[/c] gibt es dort auch. Bei nochmaligem überlegen aber ist die Quelle der Ergebnisstrings aber egal, sofern du [c]String s = text;[/c] schreibst (obwohl, du könntest auch in der Methode [c]text[/c] selbst anstelle von [c]s[/c] verwenden, würdest damit aber gegen stilistische Konformitäten verstossen) aber um himmels Willen nicht [c]String s = new String(text);[/c] denn damit legst du im Zweifelsfall [c]text[/c] ein zweites mal im Heap an, statt nur die Start- und End-Pointer des Originals zu verwenden. Okay, StringBuilder verwendet zwar auch den Heap, jedoch nur vorübergehend. Dein [c]s[/c] dagegen bleibt dort, weil es im weiteren Programmverlauf durch die Instanzen der einzelnen Wörter noch verwendet wird.
Fazit: Beste Lösung - [c]String s = text;[/c]
 

turmaline

Bekanntes Mitglied
In StringBuilder gibt es die Methode [c]deleteCharAt()[/c]. Damit lassen sich relativ einfach alle überflüssigen Whithespaces zwischen den Wörtern entfernen - würde andauerndes [c]trim()[/c] ersetzen. Die Methode [c]substring()[/c] gibt es dort auch. Bei nochmaligem überlegen aber ist die Quelle der Ergebnisstrings aber egal, sofern du [c]String s = text;[/c] schreibst (obwohl, du könntest auch in der Methode [c]text[/c] selbst anstelle von [c]s[/c] verwenden, würdest damit aber gegen stilistische Konformitäten verstossen) aber um himmels Willen nicht [c]String s = new String(text);[/c] denn damit legst du im Zweifelsfall [c]text[/c] ein zweites mal im Heap an, statt nur die Start- und End-Pointer des Originals zu verwenden. Okay, StringBuilder verwendet zwar auch den Heap, jedoch nur vorübergehend. Dein [c]s[/c] dagegen bleibt dort, weil es im weiteren Programmverlauf durch die Instanzen der einzelnen Wörter noch verwendet wird.
Fazit: Beste Lösung - [c]String s = text;[/c]

Java:
String s = text;

mit dem selben erfolg kann man auch den [c]text[/c] selbst verwenden, da ich durch [c]String s = text;[/c] lediglich eine Referenz auf [c]text[/c] erstelle und ändere somit das objekt das ich übergeben bekomme...
was sagst Du dazu? ich hoffe wir reden nicht komplet an einander vorbei---
 
B

bygones

Gast
wenn ich es richtig verstehe muesste doch deine Ausgabe folgendes sein
Java:
[lalal, la, lalal, l, ll, lalal, lalla, lhzh]
(ich geb einfach die liste aus)
du hast aber
Java:
[lalal, la, lalal, l ll, lalal, lalla, lhzh]
- jdf beim code vom ersten post.

unter der annahme ersteres ist richtig:
Java:
  public static List<String> getSubStrings(String text, int n) {
        String pat = "\\w{1," + n + "}";
        Pattern pattern = Pattern.compile(pat);
        Matcher matcher = pattern.matcher(text);
        List<String> s = new ArrayList<String>();
        while(matcher.find()) {
            s.add(matcher.group());
        }
        return s;
    }
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
... kann man auch den [c]text[/c] selbst verwenden ...
So stand es bereits in meinem ersten Post und genau so war es auch gemeint. Unter Beachtung von Angry Developers Behauptung, die im übrigen vollkommen korrekt ist, ist es auch nicht wild, wenn [c]text[/c] innerhalb der Methode neu zugewiesen wird. Ist aber wg. stilistisch nicht wiklich korrekt, weil man schlicht einen Übergabe-Parameter verändert und seinen Wert innerhalb der Methode deswegen verliert. Nach Ausserhalb der Methode aber, wird [c]text[/c] nicht verändert.
 

turmaline

Bekanntes Mitglied
wenn ich es richtig verstehe muesste doch deine Ausgabe folgendes sein
Java:
[lalal, la, lalal, l, ll, lalal, lalla, lhzh]
(ich geb einfach die liste aus)

nein der string wird nicht nach jedem leerzeichen gebrochen sondern nur in dem fall wenn der string bis zum nächsten leerzeichen größer als vorgegeben ist (weiß nicht ob ich mich klar ausgedrückt habe..)

du hast aber
Java:
[lalal, la, lalal, l ll, lalal, lalla, lhzh]
- jdf beim code vom ersten post.

ja so ist es richtig

unter der annahme ersteres ist richtig:
Java:
  public static List<String> getSubStrings(String text, int n) {
        String pat = "\\w{1," + n + "}";
        Pattern pattern = Pattern.compile(pat);
        Matcher matcher = pattern.matcher(text);
        List<String> s = new ArrayList<String>();
        while(matcher.find()) {
            s.add(matcher.group());
        }
        return s;
    }

danke, ich probiere es aus
 
B

bygones

Gast
nein der string wird nicht nach jedem leerzeichen gebrochen sondern nur in dem fall wenn der string bis zum nächsten leerzeichen größer als vorgegeben ist (weiß nicht ob ich mich klar ausgedrückt habe..)
ok dann macht mein code bsp etwas anderes, er bricht bei jedem Leerzeichen, egal wie lange der String da ist
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Datentypen String teilen Java Basics - Anfänger-Themen 5
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
F Wie String in unterschiedliche Listen teilen Java Basics - Anfänger-Themen 7
I String teilen und zwei Wörter generieren Java Basics - Anfänger-Themen 1
Guybrush Threepwood String in alle möglichen Fragmente teilen Java Basics - Anfänger-Themen 2
A eingelesene String in buchstaben teilen Java Basics - Anfänger-Themen 9
X String teilen Java Basics - Anfänger-Themen 1
D String mit split teilen und leere Felder behalten Java Basics - Anfänger-Themen 4
D String teilen die x-te Java Basics - Anfänger-Themen 13
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
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
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
C String/Char-API Java Basics - Anfänger-Themen 13
U Char zu einem String machen Java Basics - Anfänger-Themen 1
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
N null in String replacen Java Basics - Anfänger-Themen 16
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
D String mit int multiplizieren? Java Basics - Anfänger-Themen 16
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
Poppigescorn String mit mehreren Wörtern füllen? Java Basics - Anfänger-Themen 4
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34
B String - Wörter finden, welches Punkt und entsprechender Pre / Suffix hat? Java Basics - Anfänger-Themen 30
T Maximale Anzahl von Konsonanten im String Java Basics - Anfänger-Themen 6
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40

Ähnliche Java Themen

Neue Themen


Oben