Kontaktliste

mina88

Mitglied
Hallo,

der unten angegebene Quellcode speichert Beziehungen von Kontakten untereinander
hierzu enthält die Klasse Kontakt eine LinkedList, welche Referenzen auf die Freunde eines Kontaktes speichert.

Einige Methoden waren schon gegeben, andere musste ich implementieren:
Methode zeigeFreunde(int nr) -> soll freunde des kontaktes (nr) ausgeben
Methode sucheNamen (String namen) -> soll alle kontakte mit gesuchtem namen ausgeben
Methode kenner() -> alle kontakte sortiert nach anzahl der freunde ausgeben

Java:
 // Importierung der EinAusRahmen-Klassen
import keb.*;


// Die Klasse LinkedList wird in diesem Programm mehrfach benötigt
import java.util.LinkedList;

/*
 * Die Klasse Kontakt speichert alle Informationen 
 * die ein Kontakt in SEPAdress enthalten soll
 */
class Kontakt 
{

	// Der Name des Kontaktes
	String name; 
	
	// Der Vorname des Kontaktes
	String vorname;
	
	// Die Strasse des Kontaktes
	String strasse;
	
	// Die Hausnummer des Kontaktes als String, 
	// damit auch Hausnummer wie 1b gespeichert w
	// werden können
	String hausnummer;
	
	// Die Postleitzahl als Integer
	int postleitzahl;
	
	// Der Ort des Kontaktes
	String ort;
	
	// Die Liste der Freunde des Kontaktes
	LinkedList freunde;
    
    /*
     * Der Konstruktor erzeugt ein Kontaktobjekt mit den 
     * Kontaktdaten die als Parameter übergeben werden.
     */
    public Kontakt(String _name, String _vorname, String _strasse, String _hausnummer,	int _postleitzahl, String _ort) 
    {   
	    name=_name;
	    vorname=_vorname;
	    strasse=_strasse;
	    hausnummer=_hausnummer;
	    postleitzahl=_postleitzahl;
	    ort=_ort;	    
	    freunde=new LinkedList();
	}

}

/*
 * Die Klasse SEPAdress stellt die Hauptklasse mit
 * allen notwendingen Funktionalitäten
 */
public class SEPAdress extends EinAusRahmen 
{
    
   public static SEPAdress sObj = null;
   
   /*
    * Die Startmethode von SEPAdress
    */
   public static void main (String [] Aufrufparameter) 
   {
    sObj = new SEPAdress();
  
        if (Aufrufparameter.length == 1) 
        {
            Anfang (sObj, "Willkommen bei SEP-Adress!", 30, 1, Aufrufparameter[0]);
        } 
        else 
        {
            Anfang (sObj, "Willkommen bei SEP-Adress!", 30, 1);
        }
    }


	// In dieser LinkedList werden alle Adressen gespeichert.
    LinkedList adressen=null; 

	/*
	 * Diese Methode kann dazu genutzt werden, dem Benutzer
	 * Hilfestellungen zu geben.
	 */
    public void Hilfe() 
    {
        spAus ("Die Hilfe fuer SEPAdress steht ausschliesslich in\n");
        spAus ("gedruckter Form zur Verfuegung.\n");
        zeigeAus ("- Sorry -");
    }


	/*
	 * Diese Methode bearbeiten Anfragen an das System
	 */
    public void Antwort(String K) 
    {
    	
       // falls die LinkedList adressen noch nicht initialisiert
       // wurde, wird dies jetzt getan.  
       if (adressen==null) 
            adressen=new LinkedList();
 
        //
        // Das Kommando loescheDatenbank leert die komplette Datenbank
        //
        if (Wort(1,1).equalsIgnoreCase("loescheDatenbank")) 
        {
        	adressen.clear();
        	zeigeAus("Datenbank wurde geloescht!!!");
        }
        
        //
        // Kontakt <Nachname>, <Vorname>, <Strasse>, <Hausnummer>,  <Postleitzahl>, <Ort>
        //
        else if (Wort(1,1).equalsIgnoreCase("kontakt")) 
        {

			// Der Befehl kontakt kann nur dann korrekt bearbeitet werden, wenn er 6 Parameter
			// oder Sätze enthält, bei weniger als 6 Parameter wird ein Fehler gemeldet,
			// bei mehr als 6 Parametern wird die überflüssigen Parameter ignoriert.
            if (SatzAnz()<6)
            	zeigeAus("Fehlerhafte Eingabe, zu wenig Paramter!");
            else 
            { 

            // der Befehl substring(8) bei Satz(1) sorgt dafür, dass das
            // Kommando kontakt abgeschnitten wird.
            // Es würde ansonsten als Teil des Namen gespeichert.  
            // Die Methode .trim() sorgt dafür, dass in einem String führende 
            // und nachfolgende Leerzeichen gelöscht werden.
            // aus "  test  " wird "test"    

            	int plz = liesInt(5,1);
            	if (ungueltig()) 
            		zeigeAus("Die PLZ darf nur aus Ziffern bestehen!");
            	else 
            		kontaktAnlegen(Satz(1).substring(8).trim(),Satz(2).trim(), Satz(3).trim(), Satz(4).trim(), liesInt(5,1), Satz(6).trim());
            }
            
        }
        
        //
        // Das Kommando: Freund <no>, <Freund>
        //
        else if (Wort(1,1).equalsIgnoreCase("freund")) 
        {
          
          // prüfe, ob Nummern angegeben wurden.
          
          int contact  = liesInt(1,2);
          int c_friend = liesInt(2,1);
          
          if (ungueltig()) 
        	  zeigeAus("Der Befehl 'freund' wurde mit einer fehlerhaften Syntax azfgerufen.");
          else 
        	  freund(contact,c_friend);
        }

        //
        // Das Kommando: Zeige <no>, 
        //
        else if (Wort(1,1).equalsIgnoreCase("zeige")) 
        {

            int no = liesInt(1,2);
            
            if (ungueltig()) 
            	zeigeAus("Der Befehl 'zeige' wurde mit einer fehlerhaften Syntax aufgerufen.");
            else 
            	zeige(no);
            
                  
        } 
        //
        //Das Kommando: zeigeFreunde <no>
        //
        else if(Wort(1,1).equalsIgnoreCase("zeigeFreunde"))
        		{
        			int no = liesInt(1,2);
        			if (ungueltig())
        				zeigeAus("Der Befehl 'zeigeFreunde' wurde mit einer fehlerhaften Syntax aufgerufen.");
        			else
        				zeigeFreunde(no);
        		}
        //
        //Das Kommando: sucheNamen <name>
        //
        else if(Wort(1,1).equalsIgnoreCase("sucheNamen"))
        {
        	String name = Wort(1,2);
        	if(ungueltig())
        		zeigeAus("Der Befehl 'sucheNamen' wurde mit einer fehlerhaften Syntax aufgerufen.");
        	else 
        		sucheNamen(name);
        }
        else if(Wort(1,1).equalsIgnoreCase("kenner"))
        {		
        	int anz=WortAnz(1);
        	if(ungueltig())
        		zeigeAus("Der Befehl 'kenner' wurde mit einer fehlerhaften Syntax aufgerufen.");
        	else
        		kenner();
        }
        else // Befehl wurde nicht erkannt
        	zeigeAus("Der Befehl "+K+" kann nicht verarbeitet werden!");
	
    }


    // -----------------------------------------------------------------------------------------
    // Hilfsmethoden 
    // -----------------------------------------------------------------------------------------
    
    /**
     * Diese Methode liefert den Inhalt eines ganzen Satzes zurück
     */
    public String Satz(int s) 
    {
        if ((s < 1) | (s > SatzAnz())) 
        {
        	return null;
        } 
        else 
        {
            String satz="";
            for (int i=1; i<= WortAnz(s); i++) 
            {
                satz = satz.concat(" ").concat(Wort(s,i));
            }
            return satz;
        }
    }
    
    /**
     * Diese Methode liefert die aktuelle Anzahl an Kontakten, 
     * die das System zur Zeit gespeichert hat
     */    
    public int anzahlKontakte() 
    {
    	return adressen.size();
    }
	
	/**
	 * Diese Methode liefert die aktuelle Nummer des übergebenen
	 * Kontaktes k zurück. Fall k nicht in der Datenbank enthalten
	 * ist, wird automatisch -1 zurück gegeben.
	 */
	public int datensatzNummer(Kontakt k) 
	{
		return adressen.indexOf(k);		
	}	  

	/**
	 * Diese Methode fügt den Kontakt neu zu den bisherigen Kontakten
	 * hinzu
	 */
    public void fuegeKontaktEin(Kontakt neu) 
    {
        adressen.add(neu);        
    }
	
	/**
	 * Diese Methode gibt eine Refferenz auf den Kontakt mit der Nummer no
	 */
	public Kontakt holeKontakt(int no) 
	{
		if ((no > anzahlKontakte()-1) | (no < 0) )
			return null;
		else return (Kontakt)adressen.get(no);
	}	
        
    // -----------------------------------------------------------------------------------------
    // Implementierung der Befehle
    // -----------------------------------------------------------------------------------------

    /*
     * Implemtierung des Befehls Kontakt anlegen
     * Die Methode geht davon aus, dass die übergebenen 
     * Parameter im richtigen Format vorliegen.
     */
    public void kontaktAnlegen(String _name, String _vorname, String _strasse, String _hausnummer,	int _postleitzahl, String _ort) 
    {                
        
                           
    	// Ein neues Kontakt-Objekt wird erzeugt.
    	Kontakt neu = new Kontakt(_name, _vorname, _strasse, _hausnummer, _postleitzahl, _ort);    
    
    	// Den Kontakt mit der Hilfsmethode fuegeKontaktEin in den Speicher schreiben
    	fuegeKontaktEin(neu);
    
    	// Speicherung mit Meldung über Name, Vorname und no bestätigen
    	zeigeAus("Neuer Kontakt "+neu.name+", "+neu.vorname+" wurde gespeichert unter der Nummer "+datensatzNummer(neu));               
               
    }
    
    /*
     * Implementierung des Befehls Freund
     */
    public void freund(int no, int freundNo) 
    {
  
        if (no==freundNo) 
        {
        	zeigeAus("Es ist nicht angedacht, mit sich selbst befreundet zu sein!");
        	return;
        }      
        
        Kontakt kontakt = holeKontakt(no);
        
        // prüfe, ob der zu bearbeitende Kontakt 
        // überhaupt existiert.
        if (kontakt!=null) 
        {
            Kontakt freund = holeKontakt(freundNo);
            //prüfe nun ob der zweite Kontakt existiert..
            if (freund!=null) 
            {
                // Beachte, dass eine LinkedList nur Objecte speichern kann,
                // daher müssen wir den int freund in ein Integerobject umwandelm
                // damit man es in der LinkedList speichern kann.
                
                // ist der neue Freund schon in der Freundesliste?
                
                if (kontakt.freunde.contains(freund)) 
                {
                	// gib eine Fehlermeldung
                	zeigeAus("Kontakt "+kontakt.name+", "+kontakt.vorname+" ist schon mit "+freund.name+", "+freund.vorname+" befreundet");
                } 
                else 
                {
                	// nun den neunen Freund in die Liste der Freunde aufnehmen
                	kontakt.freunde.add(freund);    
                	zeigeAus("Kontakt "+kontakt.name+", "+kontakt.vorname+" hat einen neuen Freund: "+freund.name+", "+freund.vorname);
                } 
                // Ende if(kontakt.freund.contains(...
                
                
            } 
            else 
            {
                zeigeAus("Der Kontakt mit der Nummer "+freundNo+" existiert nicht.");
            } // ende if(holeKontakt(...            
                         
        } 
        else 
        {
            // Falls der Kontakt nicht existiert, gibt eine Fehlermeldung aus
            zeigeAus("Der Kontakt mit der Nummer "+no+" existiert nicht.");
        } // ende if(kontakt!=null)
    }
    
    /*
     * Implementierung der Methode zeige(no)
     */
    public void zeige(int no) 
    {        
    	Kontakt kontakt = holeKontakt(no);
        
        // prüfe, ob der zu bearbeitende Kontakt 
        // überhaupt existiert.
        if (kontakt!=null) 
        {
            zeigeAus("Kontakt Nummer "+no+": "
                    +kontakt.name+", "
                    +kontakt.vorname+"; "
                    +kontakt.strasse+" "
                    +kontakt.hausnummer+"; "
                    +kontakt.postleitzahl+" "
                    +kontakt.ort);            
        } 
        else 
        {
            // Falls der Kontakt nicht existiert, gibt eine Fehlermeldung aus
            zeigeAus("Der Kontakt mit der no "+no+" existiert nicht.");
        } // ende if(kontakt!=null)
    }          


// Ab hier neuen Programmcode ergänzen 
-------------------------------------------------------------------
   
    //Implementierung der Methode zeige Freunde
    // zeigt alle Freunde des Kontakts <nummer>
    public void zeigeFreunde(int nr)
    {
    	//Hole Kontakt mit der Nummer <nr>
		Kontakt kontakt = holeKontakt(nr);
		//Wenn der Kontakt existiert[/COLOR]
		if(kontakt!= null)
		{	//und wenn der Kontakt Freunde auf seiner Liste hat
			//gebe diese Freunde aus
			if(kontakt.freunde!=null)
			{	
				for(int i=0; i<kontakt.freunde.size(); i++)
				{
					zeigeAus("Die Freundesliste von Kontakt"+nr+": "+"\n"+ kontakt.name+ ", "+kontakt.vorname+"\n"
							+ (Kontakt)kontakt.freunde.get(i).name+"\n");
				}
			}
			//andernfalls gib eine Fehlermeldung zurück
			else
				zeigeAus("Der Kontakt mit der nr "+nr+" hat keine Freunde auf seiner Liste.");
		}
		//Falls der Kontakt nicht existiert gib eine Fehlermeldung aus
		else 
			zeigeAus("Der Kontakt mit der nr "+nr+" existiert nicht.");
    }
    
    //Implementierung der Methode sucheNamen <String>
    public void sucheNamen(String name)
    {
    	String ausgabe = "";
    	for (int i=0; i<adressen.size(); i++)
    	{
    		if(holeKontakt(i).name.equals(name))
    			ausgabe += "Kontakt Nummer "+i+": "
                +holeKontakt(i).name+", "
                +holeKontakt(i).vorname+"; "
                +holeKontakt(i).strasse+" "
                +holeKontakt(i).hausnummer+"; "
                +holeKontakt(i).postleitzahl+" "
                +holeKontakt(i).ort+"\n"; 			
    	}
            zeigeAus(ausgabe);
    }
    
    //Implemetierung der Methode kenner
    public void kenner()
    {
    	//Erstelle einen Array mit allen Kontakten
    	Kontakt [] rangliste = new Kontakt[anzahlKontakte()];
    	
    	for(int i=0; i<adressen.size(); i++)
    	{
    		rangliste[i]=holeKontakt(i);
    	}
    	//Sortiere den Array der Kontakte nach Anzahl der Freunde
    	//damit eine Rangliste entsteht
    	//Wenn KontaktX mehr Freunde hat als andere Kontakte 
    	//setze KontaktX an erster Stelle 
    	Kontakt z= null;
    	for(int i=0; i<rangliste.length; i++)
    	{
    		for(int j=0; j<rangliste.length; j++)
    		{
    			if(rangliste[j].freunde.size()>rangliste[i].freunde.size())
    				z=rangliste[i];
    				rangliste[i]=rangliste[j];
    				rangliste[j]=z;		
    		}
    	}
    	//Ausgabe der Rangliste
    	//Ausgabe von Anzahl der Freunde , Name und Vorname des Kontakts 
    	int anzFreunde=0;
    	
    	for (int k=0; k<rangliste.length; k++)
    		{	
    			anzFreunde=rangliste[k].freunde.size();
    			zeigeAus(anzFreunde+" "+rangliste[k].name+","+rangliste[k].vorname+";"+"\n");		
    		}
    }[/COLOR]

    
} // Ende von public class SEPAdress

die methode sucheNamen funktioniert
bei zeigefreunde bekam ich als freund "null" raus, dann hab ich die methode geändert jetzt habe endlosschleife
kenner funktioniert auch nicht
ich weiß nicht wie ich die daten der freunde des kontakts ausgeben kann
ich seh auch nicht den fehler bei methode kenner
:bahnhof:

ich hoffe es kann mir jemand meine fehler erklären
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
dein Code enthält viele unbekannte Methoden, wahrscheinlich aus der Klasse EinAusRahmen, kann niemand benutzen,
posten musst du die aber nicht unbedingt, es wird kaum jemand lauter Daten eintippen wollen,
überhaupt ist der Eingabecode mit plz.trim() usw. relativ langweilig,

fange immer einfach an bzw. vereinfache das Progamm wieder (evtl. in einem zweiten neuen Projekt testweise) wenn du auf grundsätzliche Probleme triffst,
ein Kontakt braucht nur einen Namen, nicht mit Details wie strasse, hausnummer aufhalten

das wichtigste aber überhaupt: absolut keine Benutzereingaben,
schreibe eine main-Methode mit
main {
Kontakt a = new Kontakt(joe);
Kontakt b = new Kontakt(max);
add(a);
add(b);
a.addFreund(b);

kenner();
zeigeFreundeVon(b);
}

usw.
alles im Programm, man muss nur Start klicken und es läuft erfolgreich durch oder bis zu einem Fehler,
dann kann man anfangen über Fehler nachzudenken

wenn diese Basis-Tests laufen, dann kannst du natürlich gerne wieder die ganzen Eingaben dazunehmen und schauen ob es dann auch läuft,
ist gewiss am Ende wichtig, im Moment aber nicht, einfach nur hinderderlich
 
G

Gast2

Gast
Kleine Anmerkung zum Konstruktor:
Java:
    public Kontakt(String _name, String _vorname, String _strasse, String _hausnummer,  int _postleitzahl, String _ort) 
    {   
        name=_name;
        vorname=_vorname;
        strasse=_strasse;
        hausnummer=_hausnummer;
        postleitzahl=_postleitzahl;
        ort=_ort;       
        freunde=new LinkedList();
    }

Ich weiß das es bei vielen üblich ist die internen Membervariablen mit einem Underscroe zu beginnnen um sich den [c]this[/c] zu ersparen. Auch wenn ich das nicht schön finde - bei extern sichtbaren Variablen finde ich es richtig unschön. Mit extern sichtbar meine ich wenn du irgendwo den Konstruktor aufrust und die deine IDE die Parameterlist anzeigt, oder z.B. in den Javadocs.

Schöner ist es meiner Meinung nach entweder der privaten Membervaribalen mit dem Underscore zu markieren (auch wenn ich das persönlich nciht mache) oder gleich mit [c]this[/c] arbeiten:

Java:
    public Kontakt(String name, String vorname, String strasse, String hausnummer,  int postleitzahl, String ort) 
    {   
        this.name = name;
        this.vorname = vorname;
        this.strasse = strasse;
        this.hausnummer = hausnummer;
        this.postleitzahl = postleitzahl;
        this.ort = ort;       
        freunde = new LinkedList();
    }

edit:// ich sehe grade das du das auch bei Methoden nutzt...
 

mina88

Mitglied
@fassy
die methoden, die parameter mit undercore enthalten waren so vorgegeben
hab wie gesagt nur die methoden kenner(), zeigeFreunde(), und sucheNamen implementiert
aber du hast recht, mich hat das am anfang verwirrt, weil ich das auch so noch nicht gesehen habe

@SlaterB
wollte zuerst eine main methode mit testdaten erstellen, aber da wir in drei wochen einen test schreiben, der auf diese übung aufbaut auch nichts im vorgegebenen programmcode ändern dürfen
(geht auch nicht aus zeitgründen) habe ich es ohne versucht
die testdaten habe ich aber in diesem "EinAusRahmen" eingegeben
sucheNamen funktioniert auch, er gibt mir die richtigen kontakte aus
aber bei zeigeFreunde gibt er mir folgendes aus :
Kontakt@2d189c
mein fehler an der stelle ist , dass ich die ausgabe der daten aus der linkedList falsch implementiert habe
(so als wenn ich System.out.print(array) geschrieben hätte, muss aber heißen Systm.out.print(array[0]) z.B.)
aber wie geht das bei linkedList?

danke
 

Wuella

Mitglied
@Mina
Wieso schaust du nicht ins Fachschaft5-Forum und stellst ggf. dort deine Fragen? :-D

Dort habe ich das Programm bereits gepostet.
 

mina88

Mitglied
@wuella
erster grund:
wollte gerne dass mir jemand bei den fehlern in meiner lösung hilft
ich will nicht die lösung von jemand anderem übernehmen, denn der programmierstil von jedem "programmierer" ist anders
zweiter grund:
einige haben im f5forum fragen zu der aufgabe gestellt und keine antwort erhalten,
deshalb dachte ich, ich versuch es lieber hier im forum, da es hier auch prgrammierexperten gibt :)

aber danke für deinen hinweis
 
S

SlaterB

Gast
> aber wie geht das bei linkedList?

get(0); ?

> aber bei zeigeFreunde gibt er mir folgendes aus :
> Kontakt@2d189c

toString() überschreiben oder nicht einfach nur das Objekt an sich ausgeben sondern getName() oder so aufrufen

> wollte zuerst eine main methode mit testdaten erstellen, aber da wir in drei wochen einen test schreiben [..]

versteh ich zwar nicht, muss ich aber auch nicht,
kein Programm, kein echtes Vorankommen
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben