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:
Klasse Geburtsjahrvergleich
Klasse Person
Klasse Personenvergleich
Klasse Telefon:
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
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>();
}
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: