# Problem mit dem mit XML sortierung



## wildthinks (29. Mai 2014)

Hallo Community,

habe ein Problem mit meinem Programm, ich habe vor ein Telefonbuch zu programmieren in dem Personen mit deren Telefonnummern aus einer XML herausgelesen werden. Außerdem wird unterschieden nach Haupttelefonnummer oder nicht.

Danach sollen folgende Funktionen zur Verfügung stehen. 
Telefonnummer suchen -> Funktioniert
Personen nach Name auflisten -> funktioniert aber Namen kommen doppelt?
Personen nach Geburtsjahr auflisten -> funkioniert aber Namen kommen ebenfalls doppelt in der Ausgabe...

main Klasse:

```
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class ausfuehren {

	//**************STATISCHE VARIABLEN*********************
	
	static boolean b= false;
	static Scanner sc = new Scanner(System.in);
	static int eingabe =0;
	static Document eingelesenesDocument;
	static Document ausgabeDocument;
	static HashMap<String, Person> Telefonbuch = new HashMap<>();
	

	
	//*****************MAIN METHODE ANFANG *********************
	
	public static void main(String[] args) {
	
		
		createParserandDocument();
		einlesen();
		

		//Schleife für die Funktion start, was das Menue darstellt
		while(b!=true){
		
		start();
		}

	}
	
	//*****************MAIN METHODE ENDE *********************
	
	//******************* Aufgabe B *********************
	//******************** METHODE start()***************
	static void start (){
		System.out.println("Bitte funktion auswählen...");
		System.out.println(" "
				+ "\nRufnummer suchen:                               > 1"
				+ "\nPersonen nach Namen auflisten:                  > 2"
				+ "\nPersonen nach Geburtsjahr absteigend auflisten: > 3"
				+ "\nPersonen nach Geburtsjahr aufsteigend auflisten:> 4"
				+ "\nexit:                                           > 5");
		
		
		eingabe = sc.nextInt();
		
		System.out.println();
		
		switch(eingabe){
		case 1: nummernSuche();;
					break;
		case 2: nameSort();
		break;
		case 3: telefonSortAbsteigend();
		break;
		case 4: telefonSortAufsteigend();;
		break;
		case 5: {
			System.out.println("...Programm beendet"
					+ "\n Bis zum nächsten mal!");
			b=true;
			}
		break;
		default: System.out.println("falsche eingabe bitte wiederholen!");
		
		
		}
		System.out.println();
		
	}
	//**************** METHODE createParserandDocument******************
	
	private static void createParserandDocument() {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(true);

		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			ausfuehren.eingelesenesDocument = builder.parse(new File(
					"src/Telefonbuch.xml"));
			ausfuehren.ausgabeDocument = builder.newDocument();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.exit(1);
		}

	}
	
	
	
	//*****************METHODE einlesen *************************
	
	static void einlesen(){
		Element oberstesElement = eingelesenesDocument.getDocumentElement();
		NodeList telefonBuchNodeList = oberstesElement.getElementsByTagName("Personen");
		for (int i =0; i< telefonBuchNodeList.getLength(); i++)
		{
			Element personenElement = (Element) telefonBuchNodeList.item(i);
			String personenNachName = personenElement.getAttribute("nachname");
			String personenVorName = personenElement.getAttribute("vorname");
			String personenGeburtsjahr = personenElement.getAttribute("geburtsjahr");
			
			
			Person person = new Person();
			person.nachname = personenNachName;
			person.vorname = personenVorName;
			person.geburtsjahr= Integer.valueOf(personenGeburtsjahr);
			person.Telefonliste = new ArrayList<>();
				
				NodeList personenNodeList = personenElement.getElementsByTagName("Telefone");
				for(int j =0; j< personenNodeList.getLength(); j++){
					Element telefonElement = (Element) personenNodeList.item(j);
					String telefonHaupt = telefonElement.getAttribute("haupt");
					String telefonLaendervorwahl = telefonElement.getAttribute("laendervorwahl");
					String telefonVorwahl = telefonElement.getAttribute("vorwahl");
					String telefonNummer = telefonElement.getAttribute("nummer");
					String telefonArt = telefonElement.getAttribute("art"); 
					
					Telefon telefon = new Telefon();
					
					telefon.haupt =  Boolean.parseBoolean(telefonHaupt);
					telefon.laendervorwahl = telefonLaendervorwahl;
					telefon.vorwahl = telefonVorwahl;
					telefon.nummer = telefonNummer;
					telefon.art =  telefonArt;
					telefon.haupttelefonnummer = telefon.laendervorwahl + telefon.vorwahl + telefon.nummer;
					person.Telefonliste.add(telefon);
					telefon.person =person;
					Telefonbuch.put(telefon.haupttelefonnummer, person);
				}
				
				
				
		}
		
	
		
	}
	//***************** METHODE nummernSuche****************************
	static void nummernSuche(){
		
		System.out.println();

		
		boolean b = false;
		while (!b) {
			System.out.println("Rufnummernsuche");
			System.out.print("Telefonnummer eingeben: ");

			try {

				String eingabe = sc.next();
				Person check = Telefonbuch.get("49"
						+ eingabe);

				if (check != null) {
					System.out.println("Person gefunden!");
					System.out.println(check.vorname);
					System.out.println(check.nachname);
					System.out.println(check.geburtsjahr);
					
					
					for (int i = 0; i<check.Telefonliste.size();i++)
					{
					System.out.print(check.Telefonliste.get(i).art + ": ");
					System.out.print(check.Telefonliste.get(i).laendervorwahl
							+ " / ");
					System.out.print(check.Telefonliste.get(i).vorwahl + " / ");
					System.out
							.println(check.Telefonliste.get(i).nummer);
					}
					b = true;

				} else {
					System.out.println("Rufnummer nicht gefunden!"
							+ "Bitte erneut eingeben \n");
				}

				System.out.println("");
			} catch (NullPointerException npe) {
				System.out.println("Nummer nicht gefunden!");
			}
		}
	}
	//***************** METHODE nameSort****************************
	static void nameSort(){

		 ArrayList<Person> PersonenListe = new ArrayList<Person>(
				Telefonbuch.values());
		Collections.sort(PersonenListe, new PersonenVergleich());
		System.out.println("Liste Sortiert nach Namen: ");
		for (Person p : PersonenListe) {

			System.out.println("Nachname: " + p.nachname + " Vorname: "
					+ p.vorname);
	}
	
	}
	//***************** METHODE telefonSortAbsteigend****************************
	static void telefonSortAbsteigend(){
		ArrayList<Person> PersonenListe = new ArrayList<Person>(
				Telefonbuch.values());
		System.out.println();
		System.out.println("Liste sortiert nach Geburtsjahr(absteigend): ");
		Collections.sort(PersonenListe, new GeburtsjahrVergleich());

		for (Person p : PersonenListe) {

			System.out.println("Nachname: " + p.nachname + " Vorname: "
					+ p.vorname + " Geburtsjahr: " + p.geburtsjahr);

		}
	}
	
	//***************** METHODE telefonSortAufsteigend****************************
	static void telefonSortAufsteigend(){
		ArrayList<Person> PersonenListe = new ArrayList<Person>(
				Telefonbuch.values());
		System.out.println();
		System.out.println("Liste sortiert nach Geburtsjahr(aufsteigend): ");
		Collections.sort(PersonenListe,
				Collections.reverseOrder(new GeburtsjahrVergleich()));

		for (Person p : PersonenListe) {

			System.out.println("Nachname: " + p.nachname + " Vorname: "
					+ p.vorname + " Geburtsjahr: " + p.geburtsjahr);

		}
	}
}
```
*
Klasse Geburtsjahrvergleich*

```
import java.util.*;


public class GeburtsjahrVergleich implements Comparator <Person>{
	
	public int compare(Person P1, Person P2){
		return Integer.valueOf(P1.geburtsjahr ).compareTo(P2.geburtsjahr);
	}

}
```

*Klasse Person*

```
import java.util.ArrayList;


public class Person {

	String vorname;
	String nachname;
	int geburtsjahr;
	
	ArrayList<Telefon> Telefonliste = new ArrayList<Telefon>();
	

	
}
```
*Klasse Personenvergleich*


```
import java.util.*;

public class PersonenVergleich implements Comparator <Person>{
	
	public int compare(Person P1, Person P2){
		return String.valueOf(P1.nachname + P1.vorname ).compareTo(P2.nachname + P2.vorname);
	}

}
```

*Klasse Telefon:*

```
public class Telefon {

	String laendervorwahl;
	String vorwahl;
	String nummer;
	String art;
	String haupttelefonnummer;
	boolean haupt;
	Person person;
	
	

}
```

Soweit die Java Klassen

Hier noch die DTD

[XML]<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT Telefonbuch (Personen+)>
<!ELEMENT Personen (Telefone+)>
<!ELEMENT Telefone EMPTY>

<!ATTLIST Personen
	vorname 	CDATA #REQUIRED
	nachname	CDATA #REQUIRED
	geburtsjahr	CDATA  #REQUIRED
	haupt		CDATA #REQUIRED
>

<!ATTLIST Telefone
	haupt			CDATA #REQUIRED
	laendervorwahl 	CDATA #REQUIRED
	vorwahl 		CDATA #REQUIRED
	nummer			CDATA #REQUIRED
	art				CDATA #REQUIRED

>


[/XML]

*Die XML*
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Telefonbuch SYSTEM "Telefonbuch.dtd">
<Telefonbuch>


	<Personen geburtsjahr="1990" nachname="Kuhl" haupt="true" vorname="Frau">
		<Telefone  vorwahl="7720" laendervorwahl="49" art="Haupttelefon" haupt="true" nummer="32294"/>
		<Telefone vorwahl="151" laendervorwahl="49" art="Mobile" haupt="false" nummer="43233704"/>
	</Personen>
	<Personen geburtsjahr="1988" nachname="Parker" haupt="true" vorname="Peter">
		<Telefone  vorwahl="7720" laendervorwahl="49" art="Haupttelefon" haupt="true" nummer="123456"/>
		<Telefone  vorwahl="160" laendervorwahl="49" art="Mobile" haupt="false" nummer="654321"/>

	</Personen>


	<Personen geburtsjahr="1985" nachname="Kuhl" haupt="true" vorname="Mann">
		<Telefone vorwahl="7721" laendervorwahl="49" art="Haupttelefon" haupt="true" nummer="111111"/>

	</Personen>
</Telefonbuch>[/XML]

Ich vermute sehr stark, dass irgend eine Verbindung zwischen Person und Telefon entweder bei XML oder bei den Klassen fehlt...

Feue mich über jede hilfreiche antwort.

Grüße

Wildthinks


----------



## turtle (29. Mai 2014)

> Telefonnummern aus einer XML


Ich finde es ganz ok, wenn die Daten AUS einer XML-Datei kommen...

Aber ob das die geeignete Struktur ist, um darin zu suchen,ändern finde ich fragwürdig. Unter anderem ist ja die schiere Menge der Einträge ein Problem, da du das gesamte Telefonbuch im Speicher haben müsstest. Und in Berlin mit 3.5 Millionen Einwohnern?

Dafür finde ich generell Datenbanken besser geeignet und schlage vor, das du die Daten *aus XML in eine Datenbank* deiner Wahl pumpst. 

Dann sind Fragen der Suche/Sortierung beantwortet, da du die Möglichkeiten der DB nutzt.


----------



## jstei001 (12. Jun 2014)

Da muss ich zustimmen XML nimmt man in der Regel um Configurationen zu speichern oder zu laden. Oder halt um Nachrichten über das Netzwerk zu versenden.

Ein Telefonbuch ist eine Typische Datenbankanwendung einfach und schnell würde es mit der Derby-DB und JPA gehen.


----------

