Fehler beim befüllen eines 1D StringArray via split

FeliXXL

Mitglied
Der "QUELLTEXT" den ich auswerte, hat bestimmte Formatierungen, sodass es eindeutige Zeichnketten sowohl vor jedem, als auch nach jedem Split gibt. Die "herausgefilterten" Werte, die zwischen - nennen es wir mal "VORSPLIT" und Zeichenkette "NACHSPLIT" sind - sind von der Anzahl her bekannt (int cntitems = Anz. Werte).

Java:
public static String[] splititems(String Quelltext, int cntitems)
{
    String[] bezeichnung = new String[cntitems];
    for(int i=0; i<cntitems; i++)
    {
        bezeichnung[i] = Quelltext.split("vorsplit")[1].split("nachsplit")[0];
        Quelltext = Quelltext.split(bezeichnung[i]+"nachsplit")[1];
    }
    return bezeichnung;
}

Nach dem auslesen von dem Wert in Zeile 6 soll dieser im String "Quelltext" nicht mehr vorkommen, damit er beim nächsten durchlauf nicht wieder rausgefiltert wird. Daher splitte ich in Zeile 7 den schon "verarbeiteten" Teil ab - müsste rein theoretisch ja funktionieren.
Gibt aber immer ERROR aus (nach erstem durchlauf)

Bitte um Hilfe
Felix
 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Data.splititems(Data.java:69)
at Data.main(Data.java:13)


Was in meinem Quellcode Zeile 69 ist ist hier in der Kurzversion Zeile 7.
Zeile 13 ist der aufruf aus der Mainfunktion:
Java:
String[] bezeichnung = splititems(Quelltext, cntitems);
 
Zuletzt bearbeitet:
Diese Meldung bekommst du immer dann wenn in Zeile 7 der Split-String nicht im String vorkommt, also wenn es nichts mehr zu splitten gibt. Die genaue Aussage der Meldung ist eigentlich nur das du auf das 2te Element in einem einelementigen Array zuzugreifen probierst.
 
Beim ersten durchlauf funktioniert es doch auch, sonst würde er ja gar nicht bis zum output kommen, der normalerweise in Zeile 8 ist, und den ich hier weggelassen habe. Dort habe ich mir Bezeichnung[ i ] angeschaut, die beim ersten durchlauf (bezeichnung[ 0 ]) ist. Dort ist exakt der gewünschte String abgespeichert. Auch die Variable "Quelltext" wurde bis dahin nach plan gesplittet. Die Ausgabe nach zeile 7 bedeutet aber, dass er beim ersten durchlauf über diese Zeile hinweg kam. Ich überprüfe den code noch mal und lass mir alle zwischenvariablen ausgeben.
 
Das es beim ersten mal funktioniert kann gut sein. Ich nehme an das halt beim zweiten Mal der Suchstring nicht mehr vorkommt. Wenn du genauere Hilfe brauchst wäre es hilfreich wenn du den vollständigen Code und Eingabedaten posten könntest
 
Java:
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;

public class Data
{
	public static void main(String[] args)
	{
		String Quelltext = stream();
		int cntitems = countitems(Quelltext);
		System.out.println(cntitems);
		String[] bezeichnung = splititems(Quelltext, cntitems);
	}
	
	public static String stream()																	// Internetseite streamen
	{
		InputStream is = null;
		String Quelltext = null;
	   	try
	   	{
	       	URL url = new URL( "http://gamigo.shot-online.de/" );									// zu streamende Seite
	      	is = url. openStream();
	       	String charset = "utf-8";
	       	Quelltext = ( new Scanner(is, charset). useDelimiter("//html//"). next() );
	   	}
	  	catch ( Exception e ) 																		// Exception
	   	{
	       	e. printStackTrace();
	   	}
	   	finally 
	   	{
	       	if ( is != null )
	       	try { is. close(); } 
	       	catch ( IOException e ) { }
	   	}
	   	return Quelltext;
	}
	
	public static int countitems(String Quelltext)													// Bestimmt die Anzahl der Events
	{																								// anhand des Vorkommen von
		int word = 0;																				// "view.asp?serial="
		int cntitems = 0;
		for(char c: Quelltext.toCharArray()){
			if(word==12 && c=='i'){cntitems++;;}if(word==12 && c!='i'){word = 0;}
			if(word==11 && c=='r'){word = 12;}if(word==11 && c!='r'){word = 0;}
			if(word==10 && c=='e'){word = 11;}if(word==10 && c!='e'){word = 0;}
			if(word==9 && c=='s'){word = 10;}if(word==9 && c!='s'){word = 0;}
			if(word==8 && c=='?'){word = 9;}if(word==8 && c!='?'){word = 0;}
			if(word==7 && c=='p'){word = 8;}if(word==7 && c!='p'){word = 0;}
			if(word==6 && c=='s'){word = 7;}if(word==6 && c!='s'){word = 0;}
			if(word==5 && c=='a'){word = 6;}if(word==5 && c!='a'){word = 0;}
			if(word==4 && c=='.'){word = 5;}if(word==4 && c!='.'){word = 0;}
			if(word==3 && c=='w'){word = 4;}if(word==3 && c!='w'){word = 0;}
			if(word==2 && c=='e'){word = 3;}if(word==2 && c!='e'){word = 0;}
			if(word==1 && c=='i'){word = 2;}if(word==1 && c!='i'){word = 0;}
			if(word==0 && c=='v'){word = 1;}
        }
		return cntitems;
	}
	
	public static String[] splititems(String Quelltext, int cntitems)
	{
		String[] bezeichnung = new String[cntitems];
		for(int i=0; i<cntitems; i++)
		{
			bezeichnung[i] = Quelltext.split("&amp;page=1\">")[1].split("</a>")[0];
			Quelltext = Quelltext.split(bezeichnung[i]+"</a>")[1];
			System.out.println(Quelltext);
			System.out.println(i+" "+bezeichnung[i]);
		}
		return bezeichnung;
	}

}
letztlich soll von der Seite "url(siehe QT)" der Neuigkeits/Events-Block via Quellcodeanalyse ausgelesen werden.
 
Zuletzt bearbeitet:
Hallo,

Warum verwendest du für dieses Problem nicht Regex? Da kannst du deinen gesammten Code in 10 Zeilen schreiben

Java:
public static String[] splititems(String Quelltext)
{
	ArrayList<String> results = new ArrayList<String>();
	Pattern pattern = Pattern.compile("&amp;page=1\">.+</a>");

	Matcher matcher = pattern.matcher(Quelltext);

	while (matcher.find())
	{
		results.add(matcher.group().substring(14, matcher.group().length() - 4);
	}

	return results.ToArray();
}

Ich hab das jetzt hier im Browser zusammengeschrieben, daher keine Garantie für syntaktische Korrektheit.
 
Der Rückgabewert ist dann ein Objekt, genau wie die Klasse, da Objekt scheinbar nicht zu String konvertierbar ist... Trotzdem: super Lösung für mein Problem! Danke
 
Zurück