Problem mit dem mit XML sortierung

wildthinks

Mitglied
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:
Java:
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

Java:
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
Java:
import java.util.ArrayList;


public class Person {

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

	
}
Klasse Personenvergleich

Java:
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:
Java:
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
 
Zuletzt bearbeitet:

turtle

Top Contributor
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

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O XPATH Problem - Anfänger XML & JSON 4
so_ein_Komischer Problem mit Clean and Build XML & JSON 1
P JAXB-Problem XML & JSON 1
S Jaxb Unmarshalling Problem XML & JSON 4
E einfaches Problem XML + XSD + jedit XML & JSON 2
S Xslt Problem XML & JSON 2
B JasperReport Problem in Runtime XML & JSON 2
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
R Problem bei: XML und XSL zu HTML XML & JSON 2
M Read / write Problem beim ByteStrom XML & JSON 2
M XML write Problem zweiter Ansatz XML & JSON 3
M XML read Problem XML & JSON 4
M XML write Problem XML & JSON 2
whitenexx Problem beim parsen von Facebook XML XML & JSON 3
M XML Unicode Problem XML & JSON 2
S XJC --> Java-Objects compile Problem XML & JSON 4
F XPath-Problem mit DOM4J XML & JSON 8
B JPA + JAXB Mapping Problem XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
G Problem beim schreiben von XML in eine File XML & JSON 2
S Encoding Problem XML & JSON 7
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
B Problem beim löschen von ChildNodes aus einem XML-DOM XML & JSON 3
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
M JExcelAPI (JXL) Encoding Problem XML & JSON 11
S DOM Parsen Problem mit HTML Sonderzeichen XML & JSON 4
A aus xml --> html Problem XML & JSON 3
Y stax Problem XML & JSON 3
slawaweis Problem mit XSLT (wahrscheinlich ein Bug in Java 6) XML & JSON 16
T Problem beim Parsen von Attribut xmlns="urn:com:test&qu XML & JSON 6
P XPath Problem XML & JSON 2
J Problem beim XML-Lesen XML & JSON 2
M Problem mit FOP in Java Programm XML & JSON 2
S Problem mit XPath XML & JSON 4
J Problem mit compile einer XSD XML & JSON 3
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
A XPath Problem XML & JSON 2
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
G Problem mit XML-Schema Validierung mit Java XML & JSON 12
B jdom: getChildren() problem XML & JSON 4
H XSL-FO Problem mit If XML & JSON 2
loadbrain XPath Problem XML & JSON 2
T addContent / Problem mit Variable XML & JSON 2
F Problem mit JAXB Unmarshaller XML & JSON 2
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
8 SAXParser Problem, startElement wird nicht ausgeführt XML & JSON 2
M Java und XSLT: Performanz-Problem XML & JSON 5
X JDOM SAXBuilder Validationschema - Problem XML & JSON 8
G Problem mit getContent XML & JSON 4
K stax problem XML & JSON 2
S Problem mit SAX XML & JSON 6
A Problem mit JasperReport XML & JSON 6
G DOCTYPE Problem beim Transformer/TransformerFactory etc. XML & JSON 13
C XSD Problem XML & JSON 16
R Problem bei Erstellung von XML(JDOM) XML & JSON 3
R Problem mit SAX-Parser characters() XML & JSON 7
M XPath Problem im Zusammenhang mit document() XML & JSON 2
P Problem beim erstellen eines neuen Elements (JDOM) XML & JSON 5
Z Problem mit getNodeValue() und setNodeValue() in DOM XML & JSON 6
H JAXB CUSTOMIZATION PROBLEM XML & JSON 2
M XPATH und RSS (Problem namespaces) XML & JSON 7
P SAXParser problem? XML & JSON 2
S Problem beim Erstellen eines pdfs XML & JSON 3
V Problem mit xsd XML & JSON 2
P XML mit hilfe von JDOM abspeichern macht Problem XML & JSON 6
G Problem mit addContent() XML & JSON 4
B DTD Problem - Reihenfolge der Einträge XML & JSON 2
R Problem beim Auslesen von Attributen XML & JSON 4
K Problem mit ant/java web services XML & JSON 4
K xml Datei mit JDOM erzeugen, Problem Namespaces XML & JSON 1
P Problem mit XML und DOM XML & JSON 2
J XML- Attribut Sortierung XML & JSON 1

Ähnliche Java Themen

Neue Themen


Oben