String in array einlesen alle x zeichen

  • Themenstarter Themenstarter Orokan
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
O

Orokan

Gast
Hallo,

wie kann ich am schnellsten ca. 5000 oder mehr Zeichen zu je 50 Zeichen in ein String[]-Array einlesen, so dass das String Array eine Länge hat von 100 sprich index 0..99 ? Einlesen mit der Split funktion geht ja nur wenn ich ein Zeichen übergebe, doch eine anzahl von Zeichen und dann soll gesplittet werden gibts ja net oder?
 
Pappenheimer++ hat gesagt.:
substring gibts, guck mal hier
http://java.sun.com/javase/6/docs/api/
unter "String"

yo soweit war ich auch nur klappts net ^^

in dem String sourceData stehen die 5000 Zeichen drin. laenge ist die Zeile wo abgeschnitten wird sprich hier würde ich die Zeile in ein Array einlesen. Doch ich bekomme einen Fehler:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 50

ok der startwert 0 im substring muss später auch vorrücken zu position 50, 100 usw. als neuer startwert aber selbst in diesem pippi beispiel müsste die ausgabe ja funzen hm...

Code:
int k=0;
		int laenge = 50;
		for(int b = 0 ; b < sourceData.length() ; laenge =+ 50 )
		{
			String newLineString = sourceData.substring(0,laenge);
			System.out.println("Zeile " + k + ": " + newLineString);
			k++;
		}
 
sourceData ist offensichtlich kürzer als 50. außerdem hast du da nen dreher in deiner schleife, laenge bleibt ständig auf 50. und davon abgesehen extrahierst du aus sourceData immer von position 0 aus.
 
Janus hat gesagt.:
sourceData ist offensichtlich kürzer als 50. außerdem hast du da nen dreher in deiner schleife, laenge bleibt ständig auf 50. und davon abgesehen extrahierst du aus sourceData immer von position 0 aus.


Code:
int k=0;
		int laenge = 50;
		System.out.println("länge: " + sourceData.length());
		String newLineString;
		int tempStart = 0;
		for(int b = 0 ; b < sourceData.length() ; laenge += 50 )
		{			
			newLineString = sourceData.substring(tempStart,laenge);
			System.out.println("Zeile " + k + ": " + newLineString);
			k++;
			tempStart += 50;
		}

Ausgabe:

Code:
länge: 569
Zeile 0: String String newString newLineStringString String
Zeile 1:  newLineStringString newLineString newLineStringri
Zeile 2: ng newLineStringString newLineString756756String n
Zeile 3: ewLineStringString newLineStringString newLineStri
Zeile 4: ngString newLineStringString newLineStringString n
Zeile 5: ewLineStrdfgfdingString newLineStringString newLin
Zeile 6: eStrinfgfdgfdggString newLineStringString 35435 ne
Zeile 7: wLineStringString newLineStringString newLineStrin
Zeile 8: gStringfgfgfgfg newLineStringString newLineStringS
Zeile 9: tring newLineStringString newLineStringString newL
Zeile 10: ineStringString newLineStringString newLineStringS
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 600

jetzt geht zwar meine Ausgabe, doch die Laufbedingung stimmt noch überhaupt nicht, denn die schleife wird 569 mal durchlaufen, ist ja klar dass nach 11 durchläufen mit 50 Zeichen eine Exception kommt, DOCH WIE sage ich der Laufzeitbedingung, dass dass schluss ist mit dem Durchlaufen der schleifen, weil ein weiteres substring mit dem wert von laenge über die sourceData.length() geht?

if(laenge > sourceData.length() ) laenge = sourceData.length() geht auch net:

Code:
länge: 561
Zeile 0: dsffffffffffffffffffffffffffffsdaeeeeeeeeeeeeeeeee
Zeile 1: eeeeeedsffffffffffffffffffffffffffffsdaeeeeeeeeeee
Zeile 2: eeeeeeeeeeeedsffffffffffffffffffffffffffffsdaeeeee
Zeile 3: eeeeeeeeeeeeeeeeeedsffffffffffffffffffffffffffffsd
Zeile 4: aeeeeeeeeeeeeeeeeeeeeeeedsffffffffffffffffffffffff
Zeile 5: ffffsdaeeeeeeeeeeeeeeeeeeeeeeedsffffffffffffffffff
Zeile 6: ffffffffffsdaeeeeeeeeeeeeeeeeeeeeeeedsffffffffffff
Zeile 7: ffffffffffffffffsdaeeeeeeeeeeeeeeeeeeeeeeedsffffff
Zeile 8: ffffffffffffffffffffffsdaeeeeeeeeeeeeeeeeeeeeeeeds
Zeile 9: ffffffffffffffffffffffffffffsdaeeeeeeeeeeeeeeeeeee
Zeile 10: eeeedsffffffffffffffffffffffffffffsdaeeeeeeeeeeeee
Zeile 11: eeeeeeeeeev
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -39
warum die 39 zeichen jetzt zuviel sind versteh ich net denn laenge müsste jetzt ja 561 sein ???
 
dann mal nen beispiel:
Code:
final int len = 50;
for( int i = 0, n = reallyLongString.length(); i < n; i += len )
{
  final String nextToken = reallyLongString.substring( i, Math.min( i + len, n ) );
  System.out.println( nextToken );
}
achte drauf, dass der substring nicht über die länge des string hinausrennt. ich habs hier mit Math.min gelöst
 
eine for loop mit 4 parametern ?? gibts das? komisch nie gesehen naja auf jeden fall gehts nun ^^ danke dir!
 
Vier Parameter und mehr gehen ... 😉
Einer muss davon die Variable sein, der andere die Bedingung und der letzte die Sache was getan werden muss.
Du kannst einiges da rein packen ... 🙂
 
das hat aber nichts mit dem problem zu tun. spart einfach paar methodenaufrufe. ist ein standardpattern, das man sich gern angewöhnen darf.
 
so nun versucht das ganze in array einzulesen:

Code:
final int len = 50;		
		int test = sourceData.length() / len +1;		
		String[] myArray = new String[test];
		
		System.out.println("array länge: " + test);
		System.out.println("datenString länge in zeichen " + sourceData.length());
		
		for( int i = 0, n = sourceData.length(); i < n; i += len )
		{
		  final String nextToken = sourceData.substring( i, Math.min( i + len, n ) );
		 myArray[i] = nextToken;
		 i++;
		}


fehler:

Code:
array länge: 10
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 51
datenString länge in zeichen 468


bei einer länge von 10 x 50 zeichen und ich habe nur 468 dürfte da doch kein Problem sein???
 
du manipulierst i innerhalb der schleife, das ist nicht gut 😉 spendier myArray ne eigene indexvariable.
 
Janus hat gesagt.:
du manipulierst i innerhalb der schleife, das ist nicht gut 😉 spendier myArray ne eigene indexvariable.
ich dachte arrays in der schleife manipulieren sei richtig, da durch das array iteriert wird? eine eigene indexvariable? Wie meinst du das?
 
Code:
final int len = 50;		
		int test = sourceData.length() / len +1;		
		String[] myArray = new String[test];
			
		for(int a = 0 ; a < myArray.length ; a++ )
		{			
			for( int i = 0, n = sourceData.length(); i < n; i += len )
			{
			  final String nextToken = sourceData.substring( i, Math.min( i + len, n ) );			 			 
			  myArray[a] = nextToken;		  
			}
			System.out.println("text: " + myArray[a]);
		}


Nun gibt er zwar alles aus was im myArray steht NUR es ist immer der gleiche Satz was ja auch klar ist, denn innerhalb der inneren for-schleife wird der counter "a" ja nicht inkrementiert....

also wenn ich nach myArray[a] = nextToken; a++; schreibe müsste der nextToken ja einen Index weiter gehen im Array doch ich bekomme auch einen error:

Code:
java.lang.ArrayIndexOutOfBoundsException: 8
???:L
 
Code:
for( int i = 0, a = 0, n = sourceData.length(); i < n; i += len, ++a ) 
{ 
  myArray[ a ] = sourceData.substring( i, Math.min( i + len, n ) );
}
 
Janus hat gesagt.:
Code:
for( int i = 0, a = 0, n = sourceData.length(); i < n; i += len, ++a ) 
{ 
  myArray[ a ] = sourceData.substring( i, Math.min( i + len, n ) );
}
super also diese x-beliebigen parameter in der java for-schleife sind ja cool ist das neu??? habe gegoogelt und meine java bücher angeschaut, finde darin aber nichts dass for-loop mehr als 3 parameter haben kann? woher hast du das?
 
Ne, das ist nicht "neu". Sieh mal genau hin: Es gibt drei Teile in dem Klammerausdruck nach "for", die jeweils mit einem Semikolon abgetrennt sind.
Code:
for(Initialisierung; Bedingung; Inkrement/Update)
Wenn du mehrere Befehle willst, kannst du die einfach mit Kommata aneinanderreihen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben