Auf ArrayList Elemente zugreifen

Spelter

Mitglied
Hallo zusammen,

ich bin noch recht neu in Java und komme eigentlich aus dem Perl/Python/PHP Umfeld.
Dort habe ich immer Hash Listen verwendet um meine Datenstrukuren zu ordnen. Nun ist das in Java ein ganz anderes Feld.

Ein Beispiel von mir ist, Parsen einer XML Datei und Speichern in einer Liste.
Das ganze funktioniert sogar ganz gut, ich kann komplexe XML Files in eine Liste schreiben:

Java:
List list_Dienste;


public parse_xml(){
		list_Dienste = new ArrayList();
	}

Nun ist die Struktur der XML Datei in der Liste list_Dienste. Im Eclipse Debugger habe ich nun diese Variable inspiziert und in den Values sind die jeweiligen Elemente von 0 aufwärts enthalten mit den Key/Value Werten (ich nehme an das es so ist) Arbeiter:Fruehschicht.

Wenn ich jetzt auf das Element zugreifen möchte, müsste ich durch die Liste gehen, was nicht das Problem wäre, allerdings möchte ich nicht einfach nur alle Schlüssel und Werte durchgehen, sondern expliziert z.b. auf den Namen oder die Schicht zugreifen. Allerdings bin ich bisher nur in der Lage mittels:

Java:
System.out.println(myDienstketten.get(0));

den Kompletten Inhalt des Arrays auszugeben. Ist es nicht möglich das ich noch den Namen des Elementes angeben kann? Oder sollte ich dann doch lieber HashLists verwenden?

Grüße
Spelter
 
@nrg
Mir geht es hierbei auch eher um das erlernen der Datenstrukturen in Java und das Auslagern der Datenstruktur in eine XML File damit ich bei änderungen nicht immer das Projekt anpassen muss, daher portiere ich das ganze von Perl nach Java. Dom4J könnte ich natürlich nehmen, aber das bringt mir nichts wenn ich nicht dahintersteige wie ich auf die Datenstrukturen zugreifen kann, z.B. per GUI. Das ist in Perlartigen Scriptsprachen eben etwas zu einfach 😉

Mittlerweile weiß ich allerdings das HashLists Objekte speichert, das bringt mir sicherlich nichts 🙂

@ARadauer
Ok, soweit bin ich jetzt eigentlich, auch das Füllen in die HashMaps ist kein Problem. Allerdings hab ich im folgenden Prototypen immernoch das Problem das ich nicht auf einen Eintrag direkt zugreifen kann.

Bedingt durch die Struktur der XML muss ich allerdings mehrdimensionale HashMaps verwenden, hier kann ich zwar mit zwei Schleifen die HashMaps ausgeben, allerdings möchte ich später auf die Inhalte eines Bestimmten Users direkt zugreifen, und zwar per GUI.

Java:
package test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class hashtable_test {

	public static void main (String[] args) {
		
		// HashMaps anlegen
		HashMap vals = new HashMap();
		HashMap hm = new HashMap( new HashMap());
		
		// Inhalte pro User anlegen zum Test
		// Alles Strings
		vals.put("Schicht", "Frueh");
		vals.put("Urlaub", "nein");
		
		// in die Hashmap den User als Key anlegen und
		// die zweite HashMap als Values
		hm.put("Testuser", vals);
		
		// Iteratoren anlegen zum Testen
		Iterator it = (Iterator) hm.entrySet().iterator();
		Iterator it2 = (Iterator) vals.entrySet().iterator();
		
		// Äussere Schleife für die erste HashMap hm
		// ausgabe
		// Testuser -> 
		//	Schicht -> Frueh
		//	Urlaub -> nein
		while (it.hasNext()) {
			
			// Eintrag Iterieren
			Map.Entry entry = (Map.Entry)it.next();
			
			// und ausgeben
			System.out.println(
					(String)entry.getKey()+ " -> "
			); // System.out.println(
			
			// Innere Schleife um für jeden User die 
			// Daten auszugeben
			while (it2.hasNext()) {
				// Eintrag Iterieren
				Map.Entry entry2 = (Map.Entry)it2.next();
				
				// und ausgeben
				System.out.println("\t" +
						(String)entry2.getKey()+ " -> " +
						(String)entry2.getValue()
				); // System.out.println("\t" +
			} // while (it2.hasNext()) {
		} // while (it.hasNext()) {
		
		// Versuch direkt auf einen Eintrag zuzugreifen
		// leider kommt nur die Ausgabe
		// {Schicht=Frueh, Urlaub=nein}
		System.out.println(hm.get("Testuser"));
		
	} // public static void main (String[] args) {
} // public class hashtable_test {

Vielleicht denke ich auch zu kompliziert, aber ich komme einfach nicht dahinter wie ich direkt auf den Schlüssel vom Testuser zugreifen kann und den Wert bekomme 🙁

Danke allerdings für die Antworten, das hat mich schonmal vorrangebracht 🙂

Grüße
Spelter
 
sollltest dich zudem auch in Generics reinlesen. Dein Code mal ein wenig anders (nur zur Info bzgl Generics):

Java:
        Map<String, String> vals = new HashMap<String, String>();
        Map<String, Map<String, String>> hm = new HashMap<String, Map<String, String>>();
        vals.put("Schicht", "Frueh");
        vals.put("Urlaub", "nein");
        hm.put("Testuser", vals);
        
        for ( Entry<String,  Map<String, String>> entryHM : hm.entrySet() ) {
        	System.out.println( entryHM.getKey());
            for ( Entry<String, String> entry : entryHM.getValue().entrySet() ) {
            	System.out.println( entry.getKey() + ", " + entry.getValue() );
            }
        }

weiss nicht wo da jetzt dein Problem ist ???:L

Vllt ist das auch einfach der falsche Weg -> "portiere ich das ganze von Perl nach Java."

Du willst Änderungen nicht immer im Code anpassen? Wie wäre es mit XML-Serialisierung oder Datenbanken oder Properties oder oder oder. Leider weiss ich nicht so recht, was du vorhast..
 
Zuletzt bearbeitet:
@nrg

Generics hab ich mir im Krankenhaus mal angelesen und werd es auch versuch in meinen Javaprogrammen mehr umzusetzen 🙂 Danke für den Tipp.

Ich hab das Programm jetzt erstmal weitergebaut, allerdings erstmal eine Roadmap zusammen geschrieben und eine paar Layoutideen für die GUI. Aus dem "kleinen" Lernprogramm für Java wird doch etwas größeres 😀

Ich hätte dir schon eher geschrieben, aber irgendwie habe ich es mit meinem Desire nicht geschafft einzuloggen im Forum.

Jetzt bin ich erstmal wieder zurück in der Firma und werd mich damit mehr beschäftigen und im Forum etwas lesen.

Bisher bin ich jetzt so verblieben das ich eine SQLite Datenbank verwenden werde für die Daten und keine XML. Und den Ansatz eines Hash im Hashes hab ich auch verworfen, das wird eine eigene Klasse und die Daten werden in der Klasse in einfachen Listen oder Hashes gehalten auf die man zugreifen kann. Ein Prototyp funktioniert schonmal besser als das was ich vorher versucht habe, und ich kann auch die Daten leichter erweitern.
Die SQLite muss dafür allerdings auf einem Netzlaufwerk liegen damit die anderen mit auf die DB Zugreifen können. Und hier die Krux: Zwei Leute gleichzeitig auf die DB Datei zugreifen lassen 🙂 Wird etwas schwierig, aber das lösen wir auch noch irgendwie. Und wenn nicht, werden es CSV Dateien :applaus:

Ob ich das selbe mit den Programm Settings mache weiß ich noch nicht. Ich habe mich jetzt etwas in die Apache Commons Configuration Doku eingelesen. Soweit ich das sehe, dürfte das aber keine Schwierigkeit sein, die Settings des Programmes in eine SQLite DB zu stecken und bei bedarf auszulesen. Da die Config auf dem Rechner liegt der Nutzer, werd ich vielleicht bei einer Flatfile Config bleiben, ob XML oder andere Aufbauten bin ich erst noch am überlegen. Gut Ding will weile haben 🙂

So long
Spelter
 

Zurück
Oben