# Effektivität und Speicherschonung



## Enigma228 (10. Jun 2009)

Telefonbuch:
Ich habe eine Xml datei und eine Klasse Person:

nun habe ich ein Eingabefenster mit mehreren Suchfeldern (Textfields)

Ich habe nun mehrere Möglichkeiten die Suche durchzuführen:
1. ich Kreiere Eine "Person" aus den Eingabefeldern und übergebe sie an den DomParser
der 
a: Person direkt mit XML Eintrag vergleicht
b: aus der Person einen "virtuellen" XML Knoten macht und dann vergleicht  
c: aus dem XML-Eintrag jedesmal eine Person macht und die mit der übergebenen Person vergleicht
(Hier hat alles den Nachteil das bei Sucheingabe natürlich nicht alle Eigenschaften der Person vor der Übergabe eingetragen werden, sondern zum Beispiel nur die Rufnummer)

2. eine ArrayList mit Suchbegriffen ohne Zuordnung (Name <-> König) was die Ergebnisse natürlich sehr ungenau wiedergibt

Ich wollte ohne DB arbeiten, damit das Prog portabler bleibt..

WAS ISt DIE BESTE Methode oder hat jemand noch bessere Vorschläge?  

ich habe eine Xml datei:Inhalt in etwa so
[XML]<?xml version="1.0" encoding="iso-8859-1"?>
<Verzeichnis>
    <Person>
        <Name>König</Name>
        <Vorname>Karl</Vorname>
        <Strasse>Elisenstr.</Strasse>
        <Nr>55</Nr>
        <Plz>xxxxxx</Plz>
        <Ort>Krefeld</Ort>
        <Msn>
            <Vorwahl>0xxx</Vorwahl>
            <RufNr>xxxxxxx</RufNr>
            <Typ>Handy</Typ>
            <Nutzung>privat</Nutzung>
        </Msn>
        <Msn>
            <Vorwahl>0xxxx</Vorwahl>
            <RufNr>xxxxxxx</RufNr>
            <Typ>Tel</Typ>
            <Nutzung>privat</Nutzung>
        </Msn>
        <Mail>
            <Adresse>xxxxxxxx@web.de</Adresse>
            <Info>keine</Info>
        </Mail>
    </Person>
    <Person>
        <Name>MyFirma</Name>
        <Strasse>H.-v.-Wunder-Str.</Strasse>
        <Nr>24</Nr>
        <Plz>xxxxx</Plz>
        <Ort>Wunderstadt</Ort>
        <Msn>
            <Vorwahl>01xx</Vorwahl>
            <RufNr>xxxxxxxxx</RufNr>
            <Typ>Handy</Typ>
            <Nutzung>privat</Nutzung>
        </Msn>
        <Msn>
            <Vorwahl>0xx</Vorwahl>
            <RufNr>xxxxxx</RufNr>
            <Typ>Tel</Typ>
            <Nutzung>privat</Nutzung>
        </Msn>
        <Mail>
            <Adresse>xxxxxxxx@yahoo.de</Adresse>
            <Info>keine</Info>
        </Mail>
    </Person>
</Verzeichnis>[/XML]

und eine Klasse Person:

```
public class Person {

	String name, firstname, street, streetnumber, city, postcode;
	ArrayList<Msn> numbers= new ArrayList<Msn>();
	ArrayList<Mail> mails= new ArrayList<Mail>();
	
	public Person() {
		
	}
		
	public Person(String name, String firstname, String street,
			String streetnumber, String city, String postcode,
			ArrayList<Msn> numbers, ArrayList<Mail> mails) {
		super();
		this.name = name;
		this.firstname = firstname;
		this.street = street;
		this.streetnumber = streetnumber;
		this.city = city;
		this.postcode = postcode;
		this.numbers = numbers;
		this.mails = mails;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstnam) {
		this.firstname = firstnam;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getPostcode() {
		return postcode;
	}
	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}
	public ArrayList<Msn> getNumbers() {
		return numbers;
	}
	public void setNumbers(ArrayList<Msn> arrayList) {
		this.numbers = arrayList;
	}
	public ArrayList<Mail> getMails() {
		return mails;
	}
	public void setMails(ArrayList<Mail> mails) {
		this.mails = mails;
	}
	
	public String getStreetnumber() {
		return streetnumber;
	}

	public void setStreetnumber(String streetnumber) {
		this.streetnumber = streetnumber;
	}


	public String getPerson(){
		String temp = new String();
		temp = getFirstname()+", "+getName()+"\n"+
			getStreet()+" "+getStreetnumber()+"\n"+
			getPostcode()+" "+getCity()+"\n";
		int n = numbers.size();
		for (int i=0;i<n;i++){
			temp = temp + numbers.get(i).getType()+" : "+numbers.get(i).getPrefix()+" "+
				numbers.get(i).getCallnumber()+" ("+numbers.get(i).getUsing()+")"+"\n";
		}
		int m = mails.size();
		for (int i=0;i<m;i++){
			temp = temp + mails.get(i).getMail()+"\n";
		}
		
		
		return temp;
	}

}
```


----------



## Wildcard (10. Jun 2009)

Du schreibst 'effektivität und speicherschonung' im Titel, also ist es eine große Datenmenge und du willst schnell suchen können.
Dafür verwendet man einen Index. Apache Lucene ist dafür hervorragend geeignet (Mit Lucene ist zB auch die Wikipedia Suche und der Java Index in Eclipse realisiert).


----------



## Enigma228 (12. Jun 2009)

Um die XML Datei einzulesen bin ich bisher wie folgt vorgegangen
nl = doc.getElementsByTagName("Person"); // Ich bekomme alle Personen in die Nodelist klappt anscheinend auch denn wenn ich nl.getLength(); testen bekomme ich die korrekte anzahl an "Person"-Knoten angezeigt

Mein Auslesen ist aber sehr fehlerhaft. wobei ich hoffe ihr könnt mir den entscheidenden Tip geben


```
for (int i=0;i<temp;i++){	// gehen jetzt die einzelnen Personen der Nodelist nl durch
			System.out.println("Schleife beginnt!");
			NodeList nl2 = nl.item(i).getChildNodes(); // hier kommt eine Exception
			System.out.println("item wurde der Nodelist2 übergeben"); 
			// Test Forschleife
			for (int t=0; t<nl2.getLength();t++){
				if(nl2.item(t).getNodeType()== Node.ELEMENT_NODE){ // 1
					if(nl2.item(t).getNodeName().equalsIgnoreCase("Index")){
					System.out.println("NodeName von nl2("+t+") : "+nl2.item(t).getNodeName());
					System.out.println("TextContent von nl2("+t+") : "+nl2.item(t).getTextContent());
					doc.getDocumentElement().removeChild(nl.item(i));
					break;
					}
				}
			}
			if(bool) break;
           }
}
```

DER FEHLER HIERBEI IST DAS NUR 1, 3 ,5 usw. AUSGLESEN WERDEN UND ER EINE NULLPOINTEREXCEPTION SCHMEISST BEIM BEFEHL: 
NodeList nl2 = nl.item(i).getChildNodes();

DAS PROBLEM IST SICHERLICH DURCH MEIN MANGELNDES VERSTÄNDNIS DES DOM PARSERs ENTSTANDEN !!

WER KANN HELFEN????

Ich habe die XML-Datei auf diese Struktur aufgrund des vorherigen Hinweises geändert..
um einen Index zu setzen der sich aus dem Erstellungsdatum des Eintrages ergibt

[XML]<?xml version="1.0" encoding="iso-8859-1"?>
<Verzeichnis>
<Person>
<Index>1244811584973</Index>
<Name>Name</Name>
<Vorname>Vorname</Vorname>
<Strasse>Strasse</Strasse>
<Nr>Nr.</Nr>
<Plz>Plz</Plz>
<Ort>Ort</Ort>
<Msn>
<Landesvorwahl>0049</Landesvorwahl>
<Vorwahl>Vorwahl</Vorwahl>
<RufNr>RufNr</RufNr>
<Typ>Tel</Typ>
<Nutzung>privat</Nutzung>
<Bemerkung>keine</Bemerkung>
</Msn>
<Msn>
<Landesvorwahl>0049</Landesvorwahl>
<Vorwahl>Vorwahl</Vorwahl>
<RufNr>RufNr</RufNr>
<Typ>Tel</Typ>
<Nutzung>privat</Nutzung>
<Bemerkung>keine</Bemerkung>
</Msn>
<Mail>
<Adresse>Mail-Adresse</Adresse>
<Info>keine</Info>
</Mail>
</Person>
<Person>
<Index>1244811602881</Index>
<Name>Name</Name>
<Vorname>Vorname</Vorname>
<Strasse>Strasse</Strasse>
<Nr>Nr.</Nr>
<Plz>Plz</Plz>
<Ort>Ort</Ort>
<Msn>
<Landesvorwahl>0049</Landesvorwahl>
<Vorwahl>Vorwahl</Vorwahl>
<RufNr>RufNr</RufNr>
<Typ>Tel</Typ>
<Nutzung>privat</Nutzung>
<Bemerkung>keine</Bemerkung>
</Msn>
<Mail>
<Adresse>Mail-Adresse</Adresse>
<Info>keine</Info>
</Mail>
</Person>
</Verzeichnis>[/XML]


----------



## Wildcard (12. Jun 2009)

Enigma228 hat gesagt.:


> Ich habe die XML-Datei auf diese Struktur aufgrund des vorherigen Hinweises geändert..
> um einen Index zu setzen der sich aus dem Erstellungsdatum des Eintrages ergibt


Ich glaube nicht, dass du verstanden hast:
Volltextrecherche ? Wikipedia

Und bitte: verzichte auf den übermäßigen Gebrauch von Großbuchstaben und verwende code tags zur Formattierung.


----------



## Murray (12. Jun 2009)

Das Überspringen des 2. 4. (usw.) Eintrags passiert, weil Du bei der Iteration die gerade verarbeiteten Elemente aus der Liste entfernst.

Das kann man sicherlich korrigieren. Du solltest Dir aber auch mal gängige Frameworks zum Überführen von Java- in XML-Strukturen (und v.v.) ansehen, z.B. XStream oder JAXB.


----------



## Enigma228 (18. Jun 2009)

Danke werde alles mal durchackern


----------

