1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

ArrayList aus String[][]

Discussion in 'Programmieren' started by Miriam1990, Oct 4, 2009.

Thread Status:
Not open for further replies.
  1. Miriam1990

    Miriam1990 Byte

    Ich möchte in Java eine ArrayList mit mehreren zweidimensionalen Arrays befüllen.

    Also so:
    Code:
    String [][] Daten = new String [2][9]; //Array erstellen
    ArrayList targetliste = new ArrayList(); //Liste erstellen
    targetliste.add(Daten); //Array zu Liste hinzufügen
    
    Hat wohl soweit auch funktioniert.. Nur jetzt möchte ich auf die Arrays auch wieder zugreifen!
    Ich dachte mir, dass ich damit z.B. das zweite Array in daten schreiben kann:
    Code:
    daten=targetliste.get(1);
    Aber leider akzeptiert er an der Stelle, wo daten steht, nur Objekte. Verstehe nur nicht, warum ich es dann überhaupt geschafft habe mein String[][] in die Liste zu bekommen, weil da wurde mir auch angezeigt, dass ich ein Objekt hinzufüge.

    Bin bei meiner Suche nach der Lösung auf das Stichwort Casting gestoßen, vllt gibt das ja jemandem nen Impuls, wie man da rangehen könnte - mir nicht..

    Wäre auf jeden Fall froh für schnelle Hilfe, weil ich grad nich so ganz einsehe, dass ich jetzt von so nem dummen Problem aufgehalten werde >.< Das kann doch nich so schwer sein :aua:
     
  2. daboom

    daboom Megabyte

    Da isse wieder ;)

    1. Mit welcher Java Version programmierst Du? Mindestens 1.5? Ich frage, weil ab dieser Version Generics hinzugekommen sind, die eigentlich genau solche Ungereimtheiten beim Einfügen von Objekten in inkompatible Listen verhindern sollen. Casten wird dann zumindest bei solchen "Trivialien" unnötig.

    2. Was genau möchtest Du, dass passiert, wenn Du ein zweidimensionales String-Array in eine Liste einfügst? Sollen alle darin enthaltenen Strings in die Liste? Dann machst Du etwas verkehrt, das musst Du nämlich manuell machen. Dein Code fügt das Array selbst in die Liste ein, d.h. die Liste ist nach dem Einfügen genau EIN Element groß, nämlich das Array.

    3. Was meinst Du mit "ein Array in Daten schreiben"?
     
  3. Miriam1990

    Miriam1990 Byte

    yes, meine java version is 1.6.0_15, um genau zu sein^^

    Ich möchte, dass pro Element in der Liste genau ein Array da ist. Es soll also eine Liste aus mehreren Arrays sein. Und ich möchte natürlich am Ende auf jedes Element des jeweiligen Arrays zugreifen können. Also, wenns so
    Code:
    String s =targetliste.get(0).[0][0];
    gehen würde, wär ich super zufrieden. Ich würde also im ersten Array in der Liste den Wert des Arrays an der Stelle [0][0] abrufen. Nur leider is das syntaxmäßig so nich erlaubt und ich weiß auch nicht, wie ichs noch probieren soll.
    Genauso zufrieden wäre ich, wenn mir die Liste ein Komplettes Array zurückgibt, über das ich dann wiederrum auf die einzelnen Werte zugreife. "daten" aus meinem Beispiel ist also einfach ein Array (das entweder noch leer ist, oder bei diesem Vorgang dann überschrieben wird), in das dann die Werte des Arrays aus der Liste reingeschrieben werden. Weil ich geh ja davon aus, dass
    Code:
    targetliste.get(1);
    ein Array zuruckgibt.
    Deswegen dann halt mein:
    Code:
    daten=targetliste.get(1);
    Das meinte ich mit "ein Array in Daten schreiben" ... hoffe man versteht was ich meine.. x.x


    Ich könnte es auch noch anders machen, aber das hab ich auch nicht hinbekommen. Aber vielleicht ist das ne etwas gängigere Variante, wo man dann auch verstehen kann, was ich eigentlich machen will...

    Und zwar wenn ich eine Klasse mache in der mehrere Strings sind. Meine Klasse heißt jetzt mal "target" und einer der Strings heißt "url". Dann kann ich davon ja ein Objekt erstellen und wunderbar auf den String zugreifen (ums ganz elegant zu machen, mal mit getter):
    Code:
    target meinTarget= new target (); //Objekt erstellen
    String url = meinTarget.get_url (); //auf Attribut zugreifen
    So und anstatt meine "targetliste" jetzt mit Arrays zu befüllen, möchte ich sie jetzt mit Objekten dieser Klasse füllen. Geht ja auch:
    Code:
    targetliste.add(meinTarget);
    Da motzt er nich. Aber wenn ich jetzt wieder auf was zugreifen will, also natürlich auf einen der Strings, dann bin ich einfach zu blöd dazu =((
     
  4. daboom

    daboom Megabyte

    Gut, also war es beabsichtigt, die Arrays in die Liste zu packen. War grundsätzlich alles schon korrekt, Dein Ansatz mit Casten geht auch schon in die richtige Richtung.

    Casten erspart man sich selbst aber, wenn man die bereits angesprochenen Generics benutzt. Damit kann man beispielsweise Listen sagen, von welchem Typ die Elemente sein werden, die man dort hineinschmeißt und entsprechend auch wieder rausholt.

    In deinem Fall sähe die Deklaration etwa so aus:

    PHP:
    List<String[][]> targetList = new ArrayList<String[][]>();

    targetList.add(daten);

    String[][] daten2 targetList.get(0);
    Rein syntaktisch schreibt man diese Typparameter also in spitze Klammern (< >) hinter den Klassennamen. Damit bindet man dann in diesem Fall die Liste an einen bestimmten Typ und der Compiler erlaubt Dir nicht mehr (zumindest nicht ohne weiteres) etwas anderes als String[][] in die Liste einzufügen. Weiterhin kannst Du aber auch sicher sein, dass Du immer String[][] aus der Liste herausbekommst.

    Letztendlich wird das ganze aber auch auf Casts abgebildet, diese unschöne Arbeit wird Dir halt nur abgenommen.
    Mit Casts würde das ganze etwa so aus sehen:

    PHP:
    List targetList = new ArrayList();

    targetList.add(daten);

    String[][] daten2 = (String[][]) targetList.get(0);
    Der Code macht genau dasselbe. Hier musst Du dem Compiler nur sagen, dass aus der Liste auch String[][] rauskommen, in dem Du das Ergebnis auf String[][] castest (der Ausdruck mit den runden Klammern). Damit sagst Du dem Compiler explizit, dass das was Du da jetzt castest, anders (immer: spezieller) interpretiert werden soll. Klappt das mal nicht (weil halt irgendwer was anderes als String[][] in die Liste packt), gibt es ne ClassCastException.

    Wenn die Indizes innerhalb des Array eine feste Bedeutung haben (wie z.B. Vorname, Nachname oder sowas), würde ich eine eigene Klasse mit entsprechenden Gettern immer vorziehen. Ansonsten hat man ständig den Umweg von bestimmten Zahlen (also die Indizes) zu deren speziellen Bedeutungen.
     
  5. Miriam1990

    Miriam1990 Byte

    jaaaaa =) es geht^^ vieeelen dank!! allerdings funktionierts nur mit dem 2. codeabschnitt.
    das mit den <> dingern kenn ich von c# auch so und hatte das am Anfang auch so probiert und hab jede menge rote unterstreichungen bekommen. Hab mal deinen Code direkt reinkopiert und da kamen dann solche schönen Fehlermeldungen:

    List cannot be resolved to a type
    Syntax error, parameterized types are only available if source level is 5.0
    The type ArrayList is not generic; it cannot be parameterized with arguments <String[][]>
    Syntax error, parameterized types are only available if source level is 5.0
    Syntax error, insert "}" to complete MethodBody

    aber das is mir jetzt eigentlich völlig egal, warum die kommen ^^ aber vllt interessierts dich ja ;-)
     
  6. daboom

    daboom Megabyte

    Welche IDE benutzt Du oder schreibst mit nem normalen Notepad?

    Laut der zweiten und vorletzten Fehlermeldung kompilierst Du nämlich mit irgendeiner Version <1.5...
     
  7. Miriam1990

    Miriam1990 Byte

    nur nochma ne ganz kurze Frage.. bin grad nich sicher, ob mein Code au&#223;entrum der Fehler is (was ich hoffe), oder ob ich was an der Funktionalit&#228;t der ArrayList falsch verstehe.
    Hab diese Zeile in meinem Code:

    targetliste.add(z&#228;hler, Daten);

    Das Array Daten ver&#228;ndert sich bei nem neuen Schleifendurchgang und soll dann eben jeweils an den n&#228;chsten index gesetzt werden. Aber ich hoffe doch, dass er wenn er das Array erst einmal in die liste reingesetzt hat, dass er dann weitere &#196;nderungen, die mit dem Array passieren nicht auch in dem Array in der Liste &#252;bernimmt? Weil bei mir sind jetzt 2 gleiche Arrays in der Liste. Klar, die hei&#223;en gleich, aber ich wollte eigentlich, dass der Inhalt unterschiedlich ist -.- Und jetzt haben eben beide die Werte von Daten, wie sie im letzten Schleifendurchgang sind.

    In Eclipse programmier ich -.-
     
  8. daboom

    daboom Megabyte

    Das Array ist immer ein und dasselbe. Stell dir vor, dass dessen daten irgendwo im PC-Speicher liegen und es verschiedene Referezen darauf geben kann. Das was Du in der "daten"-Variablen oder auch in der liste speicherst, sind lediglich solche Referenzen. Das heiß, änderst Du die Daten über eine Referenz, änderst Du das, was im Speicher steht. Greifst Du dann über eine andere Referenz wieder darauf zu, stellst Du diese Änderung natürlich auch über diese fest.

    Möchtest Du wirklich eine Kopie eines Arrays haben (oder auch sonstiger Objekte, da ist esnämlich genau dasselbe), musst Du schon explizit mit "new" eines anlegen und die Daten dort hinein kopieren.

    Welche eclipse Version? Guck mal bitte unter "Window->Preferences->Java->Compiler" nach, welcher "Compiler compliance level" dort eingestellt ist. Gegebenenfalls in den Projekteinstellungen selbst auch nochmal. Dort sollte eigentlich "1.6" stehen. Dann dürften die Fehlermeldungen bzgl. der parametrisierten Typen nicht kommen.
     
  9. Miriam1990

    Miriam1990 Byte

    oh ja du hast recht. ich hab zwar die neueren zur auswahl, aber 1.4 war angewählt..

    grr.. warum is denn der kack so festgelegt? bei nem string bleibt der wert den ich mal da reinsetze doch auch drin.. *grummel*
    aber wie soll ich das denn dann hinkriegen, dass da neue arrays drin sind? wenn ich das per hand machen könnte, dann wüsste ich ja wahrscheinlich auch wieviele elemente es mal werden und würde es erst gar nicht mit ner arrayList probieren >.<
    mein targetliste.add ist in ner schleife. dann müsste ich ja in dieser schleife immer wieder n neues array anlegen. es muss aber jedes mal anders heißen. aber soweit ich weiß, kann man Benennungen nicht variabel festlegen, oder? Also so, dass ich mit ner Schleife sagen würde, das erste Array soll Daten1, das 2. Daten2, das 3. Daten3 heißen usw.
     
  10. daboom

    daboom Megabyte

    Die Benennung ist v&#246;llig Brille, da es ja, wie gesagt nur eine Referenz auf etwas ist. Soclhe Referenz kann mal auf das eine, mal auf das andere Array zeigen, dazu ist sie da... ;)

    Die String-Klasse ist ein Spezialfall, daran sollte man sich dabei nicht orientieren :)

    Jetzt ist zumindest bei mir der Punkt gekommen, wo ich mal gern den gr&#246;&#223;eren Gesamtsinn wissen w&#252;rde, um zu kapieren, was Du mit den Array und der List &#252;berhaupt erreichen m&#246;chtest. Ich bin mir inzwischen fast sicher, dass es da eine leichetere und elegantere L&#246;sung gibt...
     
  11. Miriam1990

    Miriam1990 Byte

    mh ja das könnte wohl sein. geht sicher eleganter.. ich will nur nich einsehen, dass es so nich gehen will *störrisches unerfahrenes ding is*

    ich will eigentlich einfach nur ne xml-datei auslesen, die vom Aufbau her so aussieht:

    <targets>

    <target>
    <url>web.de</url>
    <port></port>
    </target>

    <target>
    <url>google.de</url>
    <port>80</port>
    </target>

    </targets>

    Der User kann dann halt noch beliebig viele Targets hinzufügen (außerdem kommen da später noch n paar mehr Werte als url und port dazu).
    So jetzt kannst du mich auslachen, was ich da kompliziertes draus gemacht hab...
    Nochmal vielen Dank, dass du dir so viel Zeit nimmst und immer so schnell antwortest^^

    Code:
    import java.io.FileInputStream;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamReader;
    import java.lang.String;
    import java.util.ArrayList;
    
    public class XMLauslesen2 {
    
    	public static void main(String[] args) {
    		//-------Variante mit Objekt-------
    		//target meinTarget= new target ();				
    		//ArrayList targetList = new ArrayList();
    		//targetList.add(meinTarget);
    		//target meinz = (target) targetList.get(0); 	//Zugriff	
    		
    		//-------Variante mit String[][]-------						
    		String [][] Daten = new String [2][2];
    		Daten [0][0]="url";		//0--> Bezeichnung 1--> Inhalt
    		Daten [0][1]="port";	
    		
    		ArrayList targetliste = new ArrayList();			
    
    		try {
    			XMLInputFactory factory = XMLInputFactory.newInstance(); 	
    			FileInputStream MeinInputStream = new FileInputStream("Konfig.xml");
    			XMLStreamReader parser = factory.createXMLStreamReader(MeinInputStream); 	
    		
    			String information="";
    	
    		while ( parser.hasNext() ) 
    		{ 
    			if (parser.getEventType()==XMLStreamConstants.END_ELEMENT){
    				if (parser.getLocalName()=="target"){		
    						
    					for (int b=0; b<Daten.length; b++){  //prüfen, ob Felder ausgefüllt
    						if (Daten[1][b]==null)
    							System.out.println("Das Feld '"+Daten[0][b]+"' für die URL '"+Daten[1][0]+"' wurde nicht ausgefüllt!");
    					}		
    					
    					targetliste.add(Daten);	//soo hier sollten, die verschiedenen(!) 
    													//Arrays rein..									
    				}				
    			}
    			
    			if (parser.getEventType()==XMLStreamConstants.START_ELEMENT)
    			{
    				information = parser.getLocalName();	
    				parser.next(); 
    				
    				if (parser.getEventType()==XMLStreamConstants.CHARACTERS){			      
    					if ( ! parser.isWhiteSpace() ) {						
    						for (int b=0; b<Daten.length; b++){
    							if (Daten[0][b]==information)
    								Daten[1][b]=parser.getText();								
    						}			
    					}							      
    				}
    			}
    			parser.next(); 			
    		}		
    		}catch (Exception e){System.out.println("Catch");}
    
    		//-------Ausgabe der Targets-------				
    		for (int b=0; b<targetliste.size(); b++)	//Targets durchgehen
    		{	
    			String[][] daten = (String[][]) targetliste.get(b); 					
    			for (int c=0; c<2; c++)
    			{
    				System.out.println(daten[1][c]);				
    			}				
    		}
    	}	
    }
    
    Das ist jetzt mal mein ganzes Programm inklusive der Ausgabe, um zu testen, was er da gemacht hat
     
  12. daboom

    daboom Megabyte

    So, dann wollmer mal... ;)

    Du Solltest für die Knoten (target) im XML File ne Klasse als Repräsentation basteln (So ähnlich wie ganz oben in Deinem Quellcode schon angedeutet):

    PHP:
    public class Target {
      private final 
    String url;
      private final 
    int port;

      public 
    Target(final String url, final int port) {
        
    this.url url;
        
    this.port port;
      }

      public 
    String getURL() {
        return (
    url);
      }

      public 
    int getPort() {
        return (
    port);
      }
    }
    Die Klasse musst Du dann natürlich um weitere Member erweitern, wenn Du Dein XML Modell erweiterst, also "target" weitere Knoten bekommt.

    Du solltest dann die XML Datei in solche Target Objekte überführen. Dann kann man damit im weiteren Code besser umgehen als mit nichtssagenden String-Arrays.

    Wenn Du dann den targets-Knoten aus dem XML File parst, sollte also eine List von Target bei raus kommen, irgendwie so:

    PHP:
      final List<TargetparsedTargets parseTargets(xmlFile);
    Die "parseTargets" Methode würde ich in etwa so machen:

    PHP:
    public static List<TargetparseTargets(final File xmlFilethrows ParserConfigurationExceptionSAXExceptionIOException {
            final List<
    Targetresult = new ArrayList<Target>();

            final 
    DocumentBuilderFactory factory  DocumentBuilderFactory.newInstance();
            final 
    DocumentBuilder        builder  factory.newDocumentBuilder();
            final 
    Document               document builder.parse(xmlFile);

            final 
    NodeList targetsNodes document.getChildNodes();

            for (
    int i 0targetsNodes.getLength(); ++i) {
                if (
    targetsNodes.item(i).getNodeName().equals("targets")) {
                    final 
    NodeList targetNodes targetsNodes.item(i).getChildNodes();
                    
                    for (
    int j 0targetNodes.getLength(); ++j) {
                        
    // Hier dann jedes Target einzeln behandeln
                    
    }
                }
            }

            return (
    result);
        }
    An der Stelle mit dem Kommentar in der innersten Schleife musst dann wiederum von jedem "target"-Knoten alle Kindknoten holen und diese iterieren. Jeweils wieder den Nodename gegen Deine gewünschten Elementnamen (also url und port in diesem Fall) prüfen und letztendlich eine neue "Target"-Instanz mit diesen Werten anlegen und in die Zielliste schmeißen.

    Das is jetzt zwar ganz schön viel auf einmal und auch komplett anders als Dein Ansatz, meiner Meinung nach aber wesentlich schöner. Letztendlich steht Dir ja fei, wie Du es machen möchtest ;)

    Falls Du noch weitere Fragen hast, frag :)
     
  13. Miriam1990

    Miriam1990 Byte

    hmm interessant xD ich kapier alles..

    also.. nachdem ich die ganzen imports noch gemacht hab, is erstmal fast alles rot makierte weggegangen. wo noch n fehler ist, is in der ersten zeile bei File. Gibts dafür auch nen extra import? ö.ö

    naja ich weiß nich so ganz genau, was das ding macht.. wo greift das jetzt eigentlich auf die Klasse zu? Muss ich da niemals ein Objekt erstellen?

    Soo, jetzt zu der Stelle mit dem Kommentar. Is der Ansatz richtig, dass ich jetzt sowas mache

    if (targetNodes.equals("url"))
    {
    ...= targetNodes.item(j);
    }

    um zu schauen, ob ich z.B. bei der url bin und dann den Inhalt hole? Nur eigentlich müsste ich das ja jetzt in das Objekt der Klasse Target reinhauen an der Stelle wo ich ... gemacht hab. Oder? Vllt schreib ich auch kompletten Schmand x.x
     
  14. daboom

    daboom Megabyte

    Nochmal die Frage: Welche eclipse Version benutzt Du? Strg+Leertaste bzw. Strg+Shift+O sind eigentlich Deine Freunde in eclipse.

    File müsste importiert werden, ja. Sollte eclipse aber, wie gesagt, eigentlich selbst hinkriegen.

    Also ich wollte Dir ja nicht einfach alles vorklatschen und Du weißt eigentlich gar nicht, was das alles macht. Darum habe ich den inneren Teil (bei dem Kommentar) weggelassen.

    Genau da musst Du, wie schon geschrieben, solche Target-Objekte anlegen.

    OK, noch kurz zu den XML Objekten:

    Document: Stellt ein XML Document selbst dar, mit getChildNodes() bekommt man eine NodeList, die alle Root-Knoten des Documents (also z.B. "targets") enthält.

    NodeList: Eine Liste von Knoten. Die Anzahl der Knoten darin über getLength() und einen Knoten (Node) an Index i mit item(i) holen.

    Node: Ein Knoten im XML Document. Prinzipiell ist Document selbst auch ein Knoten. Ein Node hat einen Namen (z.B. "target" oder "url"), den man über getNodeName() herausbekommt, kann wiederum Kindknoten haben (siehe Document), man kann sich aber auch den Inhalt des Knotens als Text-String holen mit getTextContent().

    Soo, das heißt jetzt an der Stelle mit dem Kommentar musst Du wiederum eine NodeList von den targetNodes holen. Diese enthalten jetzt schließlich die "url" und "port" Knoten. Also in Deinem Beispiel jeweils immer nur zwei Elemente. Diese Liste also wieder iterieren (kannste Dir bei den anderen Knoten abgucken) und den Knotennamen gegen "url" und "port" prüfen. Je nachdem musst Du den Textinhalt der Knoten (jetzt kommen ja keine Kindknoten mehr) in zwei Variablen (url und port halt) packen und nachdem Du fertig iteriert hast, aus den beiden ein Target-Objekt bauen und in die Liste packen.

    Jetzt hab ich's ja doch komplett erklärt... Naja, was soll's ;)

    Um das noch schnell klar zu stellen:

    PHP:
    if (targetNodes.equals("url")) ...
    wird immer fehlschlagen, da Du hier ein NodeList-Objekt mit einem String vergleichst.
     
  15. Miriam1990

    Miriam1990 Byte

    Eclipse Version: 3.2.2
    schöne Tastenkombinationen^^ wieder was Nützliches gelernt =)

    mh... und obwohl du schon alles erklärt hast, funzts immer noch nich =(

    aber ich hab das so schon richtig verstanden, oder:
    • also in der NodeList "targetsNodes" ist nur ein item drin
    • in der NodeList "targetNodes" steht dann jedes item für ein neu angelegtes target
    • und dann mach ich noch ne NodeList (z.B. "einzelneNodes") in der dann ein item die url ist und das nächste der port.

    Code:
    import java.io.File;
    import java.lang.String;
    import java.util.ArrayList;
    import javax.xml.parsers.ParserConfigurationException;
    import org.xml.sax.SAXException;
    import java.io.IOException;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Document;
    
    public class daboomVariante {
    
    	public static void main(String[] args) {
    
    		try {
    		daboomVariante test1 = new daboomVariante ();
    		File meinFile = new File ("Konfig.xml");
    		
    		ArrayList <Target> targetliste=test1.parseTargets(meinFile);	//Methode ausführen
    		//hier bekomm ich ne Warnung, die was mit dem static der Methode zu tun hat
    		//wozu ist die Methode static?
    		
    		//-------Testausgabe-------				
    		for (int b=0; b<targetliste.size(); b++)	//Targets durchgehen
    		{	
    			Target meinz = (Target) targetliste.get(b); 						
    			String a =meinz.getURL();
    			System.out.println (a);
    		}
    		}catch (Exception e){System.out.println("Catch..");}	
    	}
    
    	public static ArrayList<Target> parseTargets(final File xmlFile) throws ParserConfigurationException, SAXException, IOException {
            final ArrayList<Target> result = new ArrayList<Target>();
    
            final DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
            final DocumentBuilder        builder  = factory.newDocumentBuilder();
            final Document               document = builder.parse(xmlFile);
    
            final NodeList targetsNodes = document.getChildNodes();
    
            for (int i = 0; i < targetsNodes.getLength(); ++i) {
                if (targetsNodes.item(i).getNodeName().equals("targets")) {
                    final NodeList targetNodes = targetsNodes.item(i).getChildNodes();
                    
                    for (int j = 0; j < targetNodes.getLength(); ++j) { //jedes Item ist ein Target
                        // Hier dann jedes Target einzeln behandeln
                    	
                    	if (targetNodes.item(j).getNodeName().equals("target")){
                    	final NodeList einzelneNodes = targetsNodes.item(j).getChildNodes();//1.item: url, dann port,..
                    	
                    		for (int k = 0; k < einzelneNodes.getLength(); ++k) {                		
                    			if (einzelneNodes.item(k).getNodeName().equals("url"))
                    			{
                    				String url= einzelneNodes.item(k).getTextContent();
                    				System.out.println(url);
                    			}
                    		}//Ende 3. for            	
                    	}//Ende 2. if    	
                    }//Ende 2. for
                }//Ende erstes if
            }//Ende erstes for 	
            return (result);
        }//Ende Methode	
    	
    }//Ende Klasse
    
    naja und daraus hab ich jetzt diesen code gebaut, bei dem ich aber leider ins catch gerate und das aufgrund der kompletten Methode (jaa meine 11815-Exception, die einfach um alles drum geht ist natürlich auch überhaupt nich professionell, aber ich würd sagen zum testen erlaubst dus mir mal.. *lieb guck*)

    und wenn ich das in meinem debugger richtig gesehen hab, dann kommt der fehler natürlich genau in meiner ersten selbst geschriebenen zeile -.-
    also in der hier:
    Code:
    if (targetNodes.item(j).getNodeName().equals("target")){
    warum?
     
  16. daboom

    daboom Megabyte

    Nimm Dir mal eclipse Ganymede (also 3.4.x), da ist einiges imo besser.

    Die Methode ist static deklariert, weil sie keine Member der (eigentlich mit Gro&#223;buchstaben beginnenden ;)) Klasse benutzt. Sie muss in dem Fall nicht static sein, sollte sie aber. Wenn man eine static Methode aufruft, braucht man dementsprechend auch keine Instanz, das hei&#223;t man schreibt

    PHP:
    KlassenName.methodenName();
    anstatt z.B.

    PHP:
    KlassenName instanz = new KlassenName();

    instanz.methodenName();
    geht zwar auch, ist aber halt unsch&#246;n. Darum die Warnung.

    Der Code sieht eigentlich ganz gut aus, ich probier das mal aus.

    Bei der Ausgabe im catch-Block, solltest Du die geworfene Exception noch ausgeben, also z.B.

    PHP:
    System.out.println("Catch: " e);
    Den Cast auf Target kannst Du weglassen (da sollte es eigentlich auch ne Warnung geben, wie gesagt, nimm Dir mal Ganymede), da sowieso nix anderes rauskommen kann.

    Edit: Ist &#252;brigens ne NullPointerException, wei&#223; aber noch nicht warum. Du brauchst wegen der statischen Methode keine Instanz dieser Klasse, kannst Dir also die Zeile mit dem "new" ganz oben klemmen ;)

    Edit2: Alles klar, ich wusste, dass es Mist ist, wenn man eine NodeList "targetList" und die andere "targetsList" zu nennen. An der Stelle, wo Du die "einzelneNodes" Liste holst, nimmst Du halt die falsche. Einfach das "s" weg und alles ist sch&#246;n... ;)
     
    Last edited: Oct 7, 2009
  17. Miriam1990

    Miriam1990 Byte

    mh.. toller Fehler xD Naja wenigstens heißt das, dass ich die Logik verstanden hab^^

    Es is zwar jetzt um einiges schöner, aber jetzt bin ich wieder genau beim gleichen Problem. Nämlich, dass ich 2 Mal das gleiche Objekt in meiner Liste habe, wegen der tollen Referenz.. (hab schon das neue Vokabular gelernt, toll gell? ^^)
    Kennst du da auch nen Trick? oder sagst du mir jetzt, dass ich alles ganz anders aufziehen muss, um da unterschiedliche Objekte für unterschiedliche Targets reinzubekommen ö.ó
     
  18. daboom

    daboom Megabyte

    Watt is los?! ;)

    Wie haste denn jetzt die kritischen Stellen implementiert? Wenn Du in der innersten Schleife einfach für jeden Target-Knoten ein Target-Objekt mit den beiden jeweils geparsten URL und Port anlegst und in die result-Liste schmeißt, ist doch alles ok, oder nicht?

    Oder hab ich noch irgendwas nicht ganz geblickt?

    Btw: Ja, Du begreifst wirklich schnell (ohne Ironie)...
     
  19. Miriam1990

    Miriam1990 Byte

    arghhh! während ich dir antworten wollte, was ich genau verändert hab, is mir der Fehler selber aufgefallen.. x.x

    Vergiss es, jetzt bin ich happy! =)))
    Vielen Dank!!!
     
Thread Status:
Not open for further replies.

Share This Page