String split()

Hallo,

ich versuche gerade einen String: Hallo;wie;geht;es;Dir (nur mal als Beispiel) aufzusplitten.

Dazu verwende ich die Methode split();

String test = "Hallo;wie;geht;es;Dir";
String array = new String();

for(int i=0; i>=5; i++){

  array** = test.split("\\;");
  System.out.println(array**);
}

Bei der Zeile: array** = test.split("\\;"); bekomme ich folgende Fehlermeldung:

cannot convert from String[] to String

Ich stehe gerade auf der Leitung und komme nicht weiter.

SG

Diese Zeile ist falsch. da du damit keine Arraz anlegst, sondern einen neuen String

for(int i=0; i>=5; i++){

die Zeile macht auch keinen Sinn, da i = 0 automatisch kleiner als 5 ist und damit die Schleife nie durchgegangen wird.

array** = test.split("\\;");

das ist auch nicht richtig,
da selbst wenn array ein array wäre, dann wurdest du hier ein array in ein array packen

LG

Der Vollständigkeit halber

package bytewelt;

public class StringSplit
{
    public static void main(String[] args)
    {
        String test = "Hallo;wie;geht;es;Dir";
        String array[] = test.split("\\;");

        for(int i=0; i<array.length; i++){
            System.out.println(array**);
        }        
    }
}

aber vermutlich wäre ein Verweis hierauf geeigneter:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html

(Oder eben auf ein Tutorial)

Das stimmt.

Hab beim posten wohl was vergessen hineinzuschreiben.

Der code sollte so heißen:

String test = "Hallo;wie;geht;es;Dir";
String array[] = new String[4];

for(int i=0; i<4; i++){

  array** = new String();
  array** = test.split("\\;");
  System.out.println(array**);
}

Das mit der for-Schleife war ein Schlampigkeitsfehler.

Was mich aber verwirrt, ist diese Zeile außerhalb der For-Schleife:

String array[] = test.split("\\;");

Ich muss doch angeben, welcher Text aus dem String in welchen teil des Arrays geschrieben werden soll.

Bsp: Index 0 -> Hallo, Index 1 -> wie, Index 3 -> geht usw.

Verstehe das nicht ganz.

Zum befüllen eines Array verwendet man doch eine For-Schleife?

Code-Tags!

Also, wenn es immer genauso aufgebaut ist, und kein RegEx erforderlich ist, könntest du es so machen:

        String test = "Hallo;wie;geht;es;Dir";
        String array[] = new String[5];
        char delimiter = ';';
        int index = 0;
        for (int i = 0; i < test.length(); i++) {
            String s = "";
            for (; i < test.length() && test.charAt(i) != delimiter; i++) {
                s += test.charAt(i);
            }
            array[index++] = s;
        }
        for (String s : array) {
            System.out.print(s + " ");
        }
        System.out.println();

Dabei könnten ein paar Sachen auch geändert werden, i < test.length(); ist zB Geschmackssache.

Natürlich kann man auch eine Methode aufrufen, die schon ein fertiges Array liefert, wie String.split. Wenn du dir die Implementierung dieser Methode ansiehst, findest du bestimmt auch eine Schleife - du rufst sie nur indirekt auf.

Du musst ganz klar unterscheiden zwischen der Zuweisung eines kompletten Arrays zu einer Array-Variable und der Zuweisung zu einem Element eines existierenden Arrays. Der Unterschied ist so ungefähr wie wenn dir Möbel-Walther eine komplette Kommode liefert, und wenn du etwas in ein Fach der existierenden Kommode legst.

Was @CyborgBeta da vorschlägt, funktioniert nur in deinem speziellen Anwendungsfall, insbesondere musst du vorher wissen, wieviele Elemente du erwartest (oder mit einer anderen Schleife vorher zählen). Es ist gut zu verstehen, wie man etwas wie String.split selber schreiben kann, aber wenn es genau für den eigenen Anwendungsfall schon eine zehntausendfach getestete und bequeme API-Methode gibt, sollte man die vorziehen.

Gut gesprochen - ja sollte lediglich zum Verständnis dienen - er kann auch in den Quellcode schauen, wenn er mag.

Aber: .split() liefert bereits ein fertiges Array zurück (wie es Landei geschrieben hat), das Zusammenstellen braucht dann nicht.

nochmal für evtl. Lerneffekte, wenn auch immer fraglicher nach schon einiger Zeit im Forum :wink:

schreibe nie new String(), leicht zu merken, praktisch immer verdächtig,
new String() siehst du nirgendwo in Code von anderen, wo hast du das her?,
in String-Variablen maximal z.B. Leerstring „“ einfügen,

aber hier würde auch, wenn es ginge, in der Zeile danach ein String in das Array geschrieben werden, was vorher an gleicher Position drin war, ob null oder sonstiges, ist egal


ein split selbst zu programmieren ist zwar wie gesagt worden nicht ganz nötig bei fertiger Methode,
an sich aber ein edles Ansinnen was auch sehr wichtig für Übung, Programmierdenken wäre, wie es bei dir ja anscheinend noch hapert,

es wäre eine wertvolle Übung für dich, etwas in diese Richtung ohne String.spilt() (welches komplett fertiges Array liefert) zu schaffen,
nur was in dein Plan? was hattest du mit deiner Code-Idee vor?

eine Schleife bis i=4 (oder 5, < oder <= ±1…, ++ oder --…) ist schonmal insofern schlecht, als dass du selber als menschlicher Beteiligter aus dem String ablesen musst, dass es 5 Elemente sind, keine allgemeine Lösung für beliebige Strings,

aber selbst wenn keine allgemeine Lösung gesucht, sondern nur einmaliger Code für diesen einen Fall,
was ist dann dein Plan in der Schleife? was sollte 4x oder 5x test.split(„\;“); in jede Array-Position schreiben?

wieso sollte dieser Aufruf einen einzelner Teil des Strings liefern, hast du die Doku der split-Methode gelesen?,
wieso sollte bei gleichen Aufruf wiederholt alle verschiedenen Teile nacheinander kommen und nicht jedes Mal dasselbe?

forsch einem Computer Befehle zur Ausführung zu geben zeigt erfreulichen Mut, andererseits auch gefährlich, es ist Code welcher Raketen aller Art losschickt :wink:
in Java zu Hause nicht ganz so kritisch, lernt hoffentlich auch irgendwie mit der Zeit, aber bisschen mehr Planung und Sinn bei der ganzen Sache wäre noch erfreulicher :wink:
welchen Plan hast du selber, kannst du das mit Worten beschreiben?

man kann nicht wild Konstrukte ‚irgendwie mit split-Methode‘ machen und hoffen dass das Richtige rauskommt…

idealerweise erst Plan und Überlegung, und sei es etwas kompliziertes a la „im i-ten Schleifendurchlauf einen komplizierten Substring vom i-ten bis i+1-ten Semikolon im Ursprungsstring herausschneiden“,
nicht unbedingt ideal, aber zumindest eine Möglichkeit, die man angehen könnte, und später besseres

Ich soll also statt:

array** = new String();

immer:

array** = new String("");

schreiben?

Was passiert dann, was ist anders?
Bis jetzt hat es immer funktioniert.

Nein, du sollst überhaupt nichts mit new String schreiben, unter fast allen Umständen ist das Käse.

Wenn du dem sechsten Array-Element einen festen String zuweisen willst, geht das so: array[5] = "Heinz";

Natürlich kann statt der 5 oder dem "Heinz" auch jeweils eine Variable stehen.

Mehr über Arrays: http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_03_007.htm#mj11a4689950bdbe50e0c6342eb22737a6

wenn doch mal in dieser Richtung, durchaus häufig vorkommend, nur aktuell ganz unnötig,
also wenn zu befüllen, dann wäre die günstige Variante:
array** = „“;

kurz und schmerzlos
new String(); und new String(„“); gehen auch, genauso wie
new String(new String(new String(new String(new String()))));
funktioniert oder Aufruf einer Untermethode die 10 sec braucht,

schlimm sicherlich nicht, aber unnötig,
und gerade bei den Grundklassen wie String lohnt sich ein wenig auch auf Kleinigkeiten zu achten,
‚new String‘ ist etwas was in praktisch keinem Code etwas verloren hat (außer bei Spezialstellen wie Einlesen mit speziellen Codesatz oder Umwandlung byte in String),
irritiert in normalen Code jeden Leser, zu vermeiden

int x = 0;
ist auch besser als
int x = new Integer(0).intValue();

O.K,

das heißt wenn ich weiß an Stelle 5 im Array muss der Text „Beispiel“ stehen, dann befülle ich es gleich mit:

 test[4] = "Beispiel"

Wenn ich die anderen Felder momentan noch nicht befüllen möchte, dann schreibe ich in diese Felder

test[index] = "";

Besser ist, die Bezeichnung zweites mal wegzulassen:

String test = new String[10];

(Sonst fast etwas C style :thinking: )

Sorry, mein Beitrag war noch nicht fertig.

Na ja, du befüllst sie damit schon, und zwar mit dem Leerstring. Anfänglich steht null drin (*), und solange du sicherstellst, dass mit diesem null kein Unsinn getrieben wird, bis du es durch einen „richtigen“ Wert ersetzt, ist das auch kein Problem.

(*) Zumindest bei Objekt-Arrays. Für primitive Zahlentypen ist das Array inital mit 0 bzw. 0.0 gefüllt, bei boolean[] mit false und bei char[] mit '\0'.

Danke für eure Antworten!

SG

Hallo nochmals,

ich habe nun folgenden Sourcecode, wo ich die split-Methode anwende:

public void test(){
	
zum_testen1 = new String[5][5];
			
	try{
		FileReader fileReader = new FileReader(file_chooser.getSelectedFile());
		BufferedReader bufferReader = new BufferedReader(fileReader);
									
			for(int i=0; i<=4; i++){
				test = bufferReader.readLine();		
				String temp_Array[] = test.split("\\;");
					
					for(int j=0; j<=4; j++){
						zum_testen1**[j] = temp_Array[j];
					}
			        }
			}					
	catch (IOException e) {
		e.printStackTrace();
	}
}

Leider bekomme ich ständig einen:
Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 1

Das Problem scheint das temp_Array zu sein.

Beim Ausgeben steht da irgendwas drinnen, verstehe nur nicht warum?

String temp_Array[] = test.split("\;");

Ich gehe davon aus, dass du hier bei jedem Semikolon splitten willst.

Aber du splittest bei jedem „\;“ Davon gibt es in deinem String bestimmt keine, daher ist das resultierende Array 0 und beim Zugriff auf 1 bekommst du diese Excpeption.

Nebenbei bemerkt muss man seit Java 8 nicht mehr mit irgendwelchen Readern hantieren:

String fileName = ...
try (Stream<String> lines = Files.lines(Paths.get(fileName))) {
   lines.forEach(line -> {
       ...
   });
} catch (IOException e) {
    e.printStackTrace();
}

O.K.

Ich habe das aber im Internet mit: split("\;"); gefunden.

Viele schreiben es geht mit beiden, bei mir nicht.

Wozu ist eigentlich der “\” ?

Warum nicht einfach so schreiben: ’ split(";"); ', wozu brauch er den “\”?

Vielen Dank für die Hilfe!!

SG