# Geburtstag aller Angestellten am bestimmten Datum



## zarr (26. Nov 2009)

Hey leute hier die originale Aufgabenstellung:

Entwickeln Sie eine Klasse "Angestellter".
Diese stellt folgende Methode zur Verfuegung:
1: hatGeburtstag() : gibt fuer einen Angestellten an, ob der am heutigen Tag Geburstag hat (boolean)
Schreiben Sie dann eine Anwendung, die in einer Liste (ArrayList) mehrere Angestellte einfuegt (Namen, Geb-Datum); das sollte ueber eine Bildschirmeingabe erfolgen, der anwender kann mehrere Angestellte eingeben, bis er die Eingabe abbricht.
Anschliessend geben Sie aus, welche der eingegebenen Angestellten heute Geburtstag haben...

Mein Problem ist das wenn ich mehrere Eingabe tätige und eines davon richtig ist sagt er mir alle Eingaben true, das heißt er gibt alle namen + geb zurück die ich eingegeben hab er sollte aber nur die ausgeben die wirklich am gleien monat und tag gleich sind...

oder wenn das letzte falsch ist sind alle falsch...

sorry wenns bissl komisch klingt aber bin java neuling...



```
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Geburtstag 
{
	public String getName()
	{
		return this.name;
	}
	
	public String getGeburtsdatum()
	{
		return this.geb;
	}
	
	public boolean hatGeburtstag()
	{
		if(geb.equals(datum))
			{
				return true;
			}
		else
			{
				return false;
			}
	}
		
	String datum = JOptionPane.showInputDialog("Bitte Aktuelles Datum eingeben (TT/MM/YY): ");

	 {
		 System.out.println("Aktuelles Datum : "+datum);
		 System.out.println(" ");
	 }
		
		private String name ;
		private String geb;
		void datenBestimmen()
		{
		ArrayList<String> myArr = new ArrayList<String>();
		 {
	    	do{
	    	name = JOptionPane.showInputDialog("Bitte Namen eingeben");
			geb = JOptionPane.showInputDialog("Bitte Geburtstag eingeben (TT/MM/YY): ");
				myArr.add(new String(name+" "+geb));
				
				if((name.length() == 0|| geb.length() == 0))
				{
					System.out.println("Keine Eingabe erfolgt!!! Bitte erneut eingeben!!!");
				}
  			String eingabe = JOptionPane.showInputDialog("Neuen Angestellten anlegen? (j / n) ");
  			if(eingabe.equals("j"))  
  			{
  				
  			}else
  	    		{
  					int anz = myArr.size();
	    				for(int i = 0; i<anz; i++) 
	    					{
	    						System.out.println(myArr.get(i));	
	    					}	
	    						System.out.println("--------------------");
	    						System.out.println("Geburtstagskinder!!!");
	    					
	    				for(int i = 0; i<anz; i++) 
	 	    				if(hatGeburtstag()== true)
	 	    				{		
	 	   						System.out.println(hatGeburtstag());
	 	    					System.out.println(myArr.get(i));	
	 	    				}
	 	    				else  
	 	    					System.out.println("Heute keine Geburtstagskinder!!!");
	    						System.out.println(hatGeburtstag());
	    						System.exit(0);		
  	    		}
			  
	    	}while(name.length() != 0 || geb.length() !=0);		  				    			
		 }
		}
		
	public static void main(String[] args)
	{
		Geburtstag objekt = new Geburtstag();
		objekt.datenBestimmen();
	}
}
```



```
Aktuelles Datum : 26.11
 
Max Muster 26.11
Theo Test 15.03
--------------------
Geburtstagskinder!!!
Heute keine Geburtstagskinder!!!
Heute keine Geburtstagskinder!!!
false
```


----------



## Sempah (26. Nov 2009)

Wo ist deine Klasse Angestellter?


```
public boolean hatGeburtstag()
    {
        if(geb.equals(datum))
            {
                return true;
            }
        else
            {
                return false;
            }
    }
```

Hier vergleichst du immer auf die gleichen 2 Variablen?
Du könntest hier als Parameter eine Angestellten-Instanz übergeben ...


----------



## zarr (26. Nov 2009)

emm ja sorry die Klasse heißt eigentlich Angestellter( hab aber so vie rumexperementiert das ich total verplant nun bin..)
ok also sollte ich noch eine klasse Angestellter schreiben habe ich dich da richtig verstanden?
wenn ja was müsste denn da rein?
weil es steht ja eigentlich alles schon drinn was in der Klasse Geburtstag(eig Angestellter heißt)


----------



## Michael... (26. Nov 2009)

Du brauchst eine Klasse Angestellter die eigentlich nur aus Konstruktor über den Name und Geburtstag 
übergeben wird und einer Methode 
	
	
	
	





```
public boolean hasGeburtstag()
```
 besteht - selbstverständlich brauchst noch Klassenvariablen die den Namen und Geburtstag speichern. Alles andere was Du in dem obigen Code stehen hast gehört nicht in diese Klasse rein.
Ausserdem brauchst Du dann noch eine Liste in die Du Objekte vom Typ Angestellter reinstecken kannst. ...


----------



## zarr (26. Nov 2009)

hmmmmmm....
ja des versteh ich schon von der aufgabe aber ich checks nicht so wirklich wie...
sorry wie gesagt bin ein JAVA neuling^^


----------



## Sempah (26. Nov 2009)

So könnte es aussehen (ohne großartige Implementierung):


```
public class Angestellter {
	
	private String name;
	private Date geburtstag;
	
	public Angestellter(String name, Date geburtstag) {
		this.name = name;
		this.geburtstag = geburtstag;
	}
	
	public boolean hatGeburtstag() {
		boolean result = false;
                // wenn heute=Geburtstag -> result = true
		return result;
	}
	
	public String getName() {
		return name;
	}
}
```



```
public class Geburtstagsliste {
	
	private static ArrayList<Angestellter> angestellte = new ArrayList<Angestellter>();
	
	public static void main(String[] args) {	
		int next = 0;
		
		do {
			String name = JOptionPane.showInputDialog("Bitte Namen eingeben: ");
			String geburtstag = JOptionPane.showInputDialog("Bitte Geburtstag eingeben: ");
			
                        // .... Date date = ... geburtstag (String) nach Date parsen
			
			angestellte.add(new Angestellter(name, date));
			
			String[] options = { "Ja", "Nein", "Abbrechen" }; 
			next = JOptionPane.showOptionDialog( null, "Ja oder Nein?", "Möchten Sie einen weiteren Angestellten hinzufuegen?",       
						JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0] ); 
		} while (next == JOptionPane.YES_OPTION);
		
		for (Angestellter angestellter : angestellte) {
			// Angestellten + true/false ausgeben ...
		}
	}

}
```


----------



## zarr (27. Nov 2009)

Hey super danke dir !!!
Jetzt nur noch ne Frage war auch mal so weit nur habe dann mit dem parsen versagt wie mach ich den ein String zu einem Date???


----------



## ARadauer (27. Nov 2009)

DateFormat (Java 2 Platform SE 5.0)
DateFormat hat ein parse, damit kann man aus einem String ein Date machen...

Generell würde ich sagen, dass public boolean hatGeburtstag() nicht ganz in Ordnung ist....
Ich würde eher public boolean hatGeburtstag(Date datum)  schreiben.
Du fragst den Angestellten ob er an an einem bestimmten Tag Geburtstag hat... dieser Tag muss an die Methode übergeben werden, da er fachlich nichts im Object zu suchen hat.


----------



## zarr (27. Nov 2009)

hmmm ...
ganz ehrlich die Aufgabe macht mich einfach Fertig^^
sitz seit paar tagen dran und versuch alles mal so mal so, aber dann komm ich immer zu einem Punkt wo es nicht mehr weitergeht voll depremierend :-(
aber des schaff ich schon noch^^


----------



## KrokoDiehl (27. Nov 2009)

Der Code von _Sempah_ stellt doch schon 90% deiner Lösung dar oder? Es fehlt "nur" noch die Prüfung ob heute dem Geburtsdatum entspricht.

Kleiner Tipp: Die Klasse 
	
	
	
	





```
Date
```
hat eine Methode 
	
	
	
	





```
compareTo()
```
.


----------



## ARadauer (27. Nov 2009)

das wird aber nicht reichen... wenn er am 27.11.1983 geboren ist hat er trotzdem heute Geburtstag ;-)

aber aus einem Date den Tag und den Monat hohlen und diese mit den Werten eines anderen Dates zu verlgeichen sollte zu schaffen sein ;-)


----------



## KrokoDiehl (27. Nov 2009)

Holla ... stimmt ja, das Jahr darf man gar nicht vergleichen 
Aber mal eine kleine Korinthenkackerei: Hat jemand, der am 27.11.2009 geboren wurde auch am 27.11.2005 Geburtstag?


----------



## ARadauer (27. Nov 2009)

zarr hat gesagt.:


> hmmm ...
> ganz ehrlich die Aufgabe macht mich einfach Fertig^^
> sitz seit paar tagen dran und versuch alles mal so mal so, aber dann komm ich immer zu einem Punkt wo es nicht mehr weitergeht voll depremierend :-(
> aber des schaff ich schon noch^^


nicht fertig machen lassen. Programmieren ist ja kein Zufallsprodukt das auf Gefühlen berüht. Wenn man sauber Schritt für Schritt analytisch voran geht kommt man immer zu einer Lösung.


----------



## Sempah (27. Nov 2009)

So könnte man es machen (wenn auch bestimmt nicht die "sauberste" Lösung):


```
public class Geburtstagsliste {

	private static ArrayList<Angestellter> angestellte = new ArrayList<Angestellter>();

	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
		int next = 0;

		do {
			String name = JOptionPane.showInputDialog("Bitte Namen eingeben: ");
			String geburtstag = JOptionPane
					.showInputDialog("Bitte Geburtstag eingeben: ");

			Date date = null;
			try {
				date = sdf.parse(geburtstag);
			} catch (ParseException e) {
				e.printStackTrace();
				System.exit(0);
			}
			angestellte.add(new Angestellter(name, date));

			String[] options = { "Ja", "Nein", "Abbrechen" };
			next = JOptionPane.showOptionDialog(null, "Ja oder Nein?",
					"Möchten Sie einen weiteren Angestellten hinzufuegen?",
					JOptionPane.YES_NO_CANCEL_OPTION,
					JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
		} while (next == JOptionPane.YES_OPTION);

		Date heute = new Date();

		for (Angestellter angestellter : angestellte) {
			System.out.println(angestellter.getName() + " "
					+ angestellter.hatGeburtstag(heute, sdf));
		}
	}

}
```

Wie ARadauer bereits erwähnte, wäre es sauberer das Datum von heute in hatGeburtstag() mit zu übergeben (habe zusätzlich das SimpleDateFormat übergeben, so dass du es nur einmal definieren brauchst).

hatGeburtstag könnte dann so aussehen:


```
public boolean hatGeburtstag(Date heute, SimpleDateFormat sdf) {
		boolean result = false;	

		if (sdf.format(geburtstag).substring(1, 5).equals(sdf.format(heute).substring(1, 5))) {
			result = true;
		}
		return result;
	}
```


----------



## ARadauer (27. Nov 2009)

ich würd das so machen


```
public boolean hatGeburtstag(Date heute) {
     GregorianCalendar heuteCal = new GregorianCalendar();
     heuteCal.setTime(heute);
     
     GregorianCalendar geburtstagCal = new GregorianCalendar();
     geburtstagCal.setTime(geburtstag);

     return (heuteCal.get(Calendar.DAY_OF_MONTH) == geburtstagCal.get(Calendar.DAY_OF_MONTH)&&
           heuteCal.get(Calendar.MONTH) == geburtstagCal.get(Calendar.MONTH));
  }
```
aber deins funtioniert natürlich auch...


----------



## zarr (27. Nov 2009)

ICH DANKE EUCH VOM GANZEM HERZEN^^
echt super danke
ich versuchs nochmal mit meinem Code rum zu experementieren aber eure Lösung top danke^^


----------



## zarr (30. Nov 2009)

Hey nochmal ich ^^
undzwar folgendes Problem wenn ich die Mitarbeiter ausgeben will die z.b. am 30.11.2000 geburtstag haben wird nur einer angezeigt also wenn Mitarbeiter mit dem gleichem Geburtstag/Monat/Jahr sind


```
public class MitarbeiterGeb 
{
	
public static void main(String[] args)
{
	SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
	String name;
	String geb;
	String eingabe;
	
	ArrayList<Mitarbeiter> mitarbeiter1 = new ArrayList<Mitarbeiter>();
	do
	{
		name = JOptionPane.showInputDialog("Bitte Namen eingeben");
		geb = JOptionPane.showInputDialog("Bitte Geburtstag eingeben (TT/MM/YYYY): ");

		Date date = null;
        try 
        {
            date = sdf.parse(geb);
        } 
        catch (ParseException e) 
        {
        	   e.printStackTrace();
               System.exit(0);
        }
        
        mitarbeiter1.add(new Mitarbeiter(name, date));
       
        eingabe = JOptionPane.showInputDialog("Neuen Angestellten anlegen? (j / n) ");
        	
    } while (eingabe.equals("j"));
	
		Date heute = new Date();
	
	 for (Mitarbeiter mitarbeiter : mitarbeiter1) 
	 	{
         	System.out.println(mitarbeiter.getName() + " "
         	+mitarbeiter.getGeburtstag());
	 	}
	 
	 System.out.println("-----------------------------");
	 System.out.println("Heutige Geburtstagskinder !!!");
	 System.out.println(" ");
	 for (Mitarbeiter mitarbeiter : mitarbeiter1) 
	 
		 	if(mitarbeiter.hatGeburtstag(heute)==(true))
		 	 	{	 
		 			System.out.println(mitarbeiter.getName()+" "+mitarbeiter.getGeburtstag());
		 			System.exit(0);
		 	 	}
}}
```


----------



## eRaaaa (30. Nov 2009)

du rufst ja auch  [c]System.exit(0);[/c] auf 
da wird dein programm beendet !


----------



## SlaterB (30. Nov 2009)

wenn das mal nicht mit Zeile 50 zu tun hat,
ist dir deren Funktion bekannt?


-------

Tipp:
nicht für jeden Testdurchlauf alle Daten neueintippen,
kannst du auch im Programm vorgeben,
wenn alles läuft am Ende die Eingabe wieder einbauen und auch nochmal testen



----

if(mitarbeiter.hatGeburtstag(heute)==(true))
->
if(mitarbeiter.hatGeburtstag(heute)==true)
->
if(mitarbeiter.hatGeburtstag(heute))


----------



## zarr (30. Nov 2009)

hehe danke habs schon selber gefunden ^^ :toll:


----------



## zarr (30. Nov 2009)

Hey noch mal ne Frage also als ergebniss komm jetzt beim datum "Max Muster Thu Nov 30 00:00:00 CET 2000"
wie kann ich nun machen das ich das Datum in 30.11.2000 umwandle???
hab versucht das ich...

```
public String getGeburtstag(String geb) 
    {
        return geb;
    }
```
...beim Mitarbeiter.java 


```
public class MitarbeiterGeb 
{
	
public static void main(String[] args)
{
	SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
	String name;
	String geb;
	String eingabe;
	
	ArrayList<Mitarbeiter> mitarbeiter1 = new ArrayList<Mitarbeiter>();
	do
	{
		name = JOptionPane.showInputDialog("Bitte Namen eingeben");
		geb = JOptionPane.showInputDialog("Bitte Geburtstag eingeben (TT/MM/YYYY): ");

				
		Date date = null;
        try 
        {
            date = sdf.parse(geb);
        } 
        catch (ParseException e) 
        {
        	   e.printStackTrace();
               System.exit(0);
        }
        
        mitarbeiter1.add(new Mitarbeiter(name, date));
       
        eingabe = JOptionPane.showInputDialog("Neuen Angestellten anlegen? (j / n) ");
        	
    } while (eingabe.equals("j"));
	
		Date heute = new Date();
	
	 for (Mitarbeiter mitarbeiter : mitarbeiter1) 
	 	{
         	System.out.println(mitarbeiter.getName() + " "
         	+mitarbeiter.getGeburtstag(geb));
	 	}
	 
	 System.out.println("-----------------------------");
	 System.out.println("Heutige Geburtstagskinder !!!");
	 System.out.println(" ");
	 int anz = 0;
	 {
	 for (Mitarbeiter mitarbeiter : mitarbeiter1) 
	
		 	if(mitarbeiter.hatGeburtstag(heute)==(true))
		 	 	{	 
		 			System.out.println(mitarbeiter.getName()+" "+mitarbeiter.getGeburtstag(geb));
		 			anz += 1;
		 			
		 	 	}	 	
	 }
	if(anz==0)
	{
		System.out.println("Heute keine Geburtstagskinder!!!");
	}
}}
```
.... beim MitarbeiterGeb.java 
der macht das zwar dann mit dem richtigem Datum doch er nimmt immer nur das letzte eingegebene vom Mitarbeiter für alle eingegebenen...
z.b. Max Muster 30.11.2000 
      Test Test 05.05.1985
dann macht er für beide datum 05.05.1985...


----------



## SlaterB (30. Nov 2009)

und da schreibst du eher ein Forum-Post als dein lokal-verfügbares Gehirn einzuschalten?

falsche Formatierung ist eine Sache, muss man nicht wissen,
aber


```
public String getGeburtstag(String geb) 
    {
        return geb;
    }
```
kannst du doch nicht ernst meinen, da wird der übergebene String direkt zurückgegeben, der Mitarbeitet bringt nichts von seinen Informationen ein, 
wieso wird die Methode überhaupt aufgerufen und nicht direkt 
 System.out.println(mitarbeiter.getName() + " " + geb);

so kann es also nicht gehen


----------



## zarr (30. Nov 2009)

hmmm ja wenn ich ja das mache 
System.out.println(mitarbeiter.getName() + " " + geb);
kommt doch genau der gleiche Fehler!!!^^
deswegen hab ich mal versucht ne andere lösung zu finden


----------



## SlaterB (30. Nov 2009)

```
System.out.println(mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));
```


----------



## zarr (30. Nov 2009)

Hey genau des wars dieses sdf.format hab ich ja total übersehn ^^
aber dank dir super schnelle Hilfe^^:toll:


----------



## zarr (1. Dez 2009)

Hey es fehlt noch der Eintrag ...


```
heuteCal.get(Calendar.YEAR) >= geburtstagCal.get(Calendar.YEAR));
```

damit der Geburtstag jünger ist als aktuelles Jahr 
z.b. Aktuelles Datum 01.12.2009
      Geb-Datum 01.12.2012


----------



## zarr (2. Dez 2009)

Hey leute hab mir gedacht das ich auch machen könnte das wenn Mitarbeiter mit gleichen Namen sind die auszugeben.
Doch das muss eine Methode sein also in der Klasse Mitarbeiter.

```
public boolean namensVergleich()
    {
    	if(name.equals(true))
    	{
    		System.out.println(name);
    		return true;
    	}
    	
    	else 
    		System.out.println("Keine Mitarbeiter mit gleichen Namen");
    		return false;
    }
```

... doch wenn ich ja dies mache vergleicht ja nur den eingegebenen Namen also is der wert immer true...
hat einer vllt ein denkanstoß?^^


----------



## Michael... (2. Dez 2009)

Die Logik ob eine Liste Mitarbeiter mit dem selben Namen enthält muss in der/ um die Liste selbst implementiert werden.
Das einzige was ein Mitarbeiter machen kann ist zu prüfen, ob er den selben Namen hat wie ein konkreter anderer. z.B. mit folgender Methode:

```
public boolean hasSameName(Mitarbeiter mitarbeiter) {
    return this.name.equals(mitarbeiter.getName());
}
```


----------



## w0ddes (2. Dez 2009)

zarr hat gesagt.:


> Hey leute hab mir gedacht das ich auch machen könnte das wenn Mitarbeiter mit gleichen Namen sind die auszugeben.
> Doch das muss eine Methode sein also in der Klasse Mitarbeiter.
> 
> ```
> ...



So kann das ja nicht gehen, du vergleichst den "Namen" mit "true" 
Man müsste das ganze etwa so machen: 


```
public boolean namensVergleich(Mitarbeiter mitarbeiter){

   if (this.name.equals(mitarbeiter.getName()){   
        System.out.println("Gleicher Mitarbeiter" + name);
        return true;
  }
}
```

EDIT: Michael war zu schnell  Beides der gleiche Ansatz


----------



## zarr (2. Dez 2009)

Hey danke für die schnelle lösung nur dann kommt aber immer noch true raus oder mach ich da was falsche?

Klasse Mitarbeiter


```
public boolean hasSameName(Mitarbeiter mitarbeiter) {
    return this.name.equals(mitarbeiter.getName());
}
```


Klasse MitarbeiterGeb


```
for(Mitarbeiter mitarbeiter : mitarbeiter1) 
	 		if(mitarbeiter.hasSameName(mitarbeiter))
		 			{
		 				System.out.println(mitarbeiter.hasSameName(mitarbeiter)+" "+mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));	
		 			}
	 		else
	 		{
	 			 System.out.println("Keine Mitarbeiter mit gleichen Namen");
	 		}
```

ergebniss ist immer true...


----------



## KrokoDiehl (2. Dez 2009)

```
if(mitarbeiter.hasSameName(mitarbeiter))
```
 ... na überleg mal, warum da immer _true _zurück kommt


----------



## w0ddes (2. Dez 2009)

in Zeile 2 musst du auch die 2 verschiedenen mitarbeiter vergleichen. Also 


```
if(mitarbeiter.hasSameName(mitarbeiterAndere))
```

EDIT: bin einfach zu langsam


----------



## zarr (2. Dez 2009)

KrokoDiehl hat gesagt.:


> ```
> if(mitarbeiter.hasSameName(mitarbeiter))
> ```
> ... na überleg mal, warum da immer _true _zurück kommt



ja des hab ich schon selber gemerkt ^^
aber danke^^


----------



## w0ddes (2. Dez 2009)

und wo liegt das Problem? 
Oder hat es sich erledigt?


----------



## zarr (2. Dez 2009)

emmmm ja da gibt der ja immer true zurück oder nicht ? ^^
des problem der vergleicht mir nur den namen und nicht die ganze liste also fehlen die anderen namen zum vergleichen wie du schon geschrieben hast mitarbeiterAndere^^ ;-) 
hoff habs richtig verstanden oda?


----------



## w0ddes (2. Dez 2009)

Ich glaube ich weiß was du meinst.Aber könntest du nochmal den (gesammten) Code mit allen bisherigen Änderungen posten? 
Ich hab grade total den Überblick verloren


----------



## KrokoDiehl (2. Dez 2009)

Willst du jeden Mitarbeiter mit jedem anderen vergleichen? Dann musst du zwei verschachtelte Schleifen nehmen. Natürlich den Fall beachten, dass man sich nicht mit sich selbst vergleicht 
Etwa so:

```
for (Mitarbeiter erster : mitarbeiterListe)
{
    for (Mitarbeiter zweiter : mitarbeiterListe)
    {
        if (erster.equals(zweiter))
            continue; // ich bin ich, das ist trivial :)
        // vergleichen und sonstwas tun
    }
}
```


----------



## zarr (2. Dez 2009)

w0ddes hat gesagt.:


> Ich glaube ich weiß was du meinst.Aber könntest du nochmal den (gesammten) Code mit allen bisherigen Änderungen posten?
> Ich hab grade total den Überblick verloren



hehe na klar doch ;-)

Klasse Mitarbeiter


```
public class Mitarbeiter
{
	private String name;
	private java.util.Date geb;
	
	public Mitarbeiter(String name, java.util.Date geb)
	{
		this.geb=geb;
		this.name=name;
	}
	
    public boolean hatGeburtstag(Date heute) {
        GregorianCalendar heuteCal = new GregorianCalendar();
        heuteCal.setTime(heute);
        
        GregorianCalendar geburtstagCal = new GregorianCalendar();
        geburtstagCal.setTime(geb);
    
        return (heuteCal.get(Calendar.DAY_OF_MONTH) == geburtstagCal.get(Calendar.DAY_OF_MONTH)&&
              heuteCal.get(Calendar.MONTH) == geburtstagCal.get(Calendar.MONTH)&&
              heuteCal.get(Calendar.YEAR) >= geburtstagCal.get(Calendar.YEAR));
     }
    
    public String getName() 
    {
        return name;
    }
    
    public Date getGeburtstag() 
    {
        return geb;
    }
    
    public boolean hasSameName(Mitarbeiter mitarbeiter) {
        return this.name.equals(mitarbeiter.getName());
    }
    
}
```

Klasse MitarbeiterGeb

```
public class MitarbeiterGeb 
{
	
public static void main(String[] args)
{
	SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

	String name;
	String geb;
	String eingabe;
	
	ArrayList<Mitarbeiter> mitarbeiter1 = new ArrayList<Mitarbeiter>();
	do
	{
		name = JOptionPane.showInputDialog("Bitte Namen eingeben");
		geb = JOptionPane.showInputDialog("Bitte Geburtstag eingeben (TT/MM/YYYY): ");

				
		Date date = null;
        try 
        {
            date = sdf.parse(geb);
        } 
        
        catch(ParseException e) 
        {
        	   e.printStackTrace();
               System.exit(0);
        }
        
        mitarbeiter1.add(new Mitarbeiter(name, date));
       
        eingabe = JOptionPane.showInputDialog("Neuen Angestellten anlegen? (j / n) ");
        	
    }while(eingabe.equals("j"));
	
		Date heute = new Date();
	
	 for(Mitarbeiter mitarbeiter : mitarbeiter1) 
	 		{
		 		System.out.println(mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));
	 		}
	 
	 System.out.println(" ");
	 System.out.println("-----------------------------");
	 System.out.println("Heutige Geburtstagskinder !!!");
	 System.out.println(" ");
	 int anz = 0;
	 {
		 for(Mitarbeiter mitarbeiter : mitarbeiter1) 
		 {
			 if(mitarbeiter.hatGeburtstag(heute)==(true))
			 	{	 
		 			System.out.println(mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));
		 			anz += 1;	
			 	}		
	 }
	
	 	if(anz==0)
	 		{
	 			System.out.println("Heute keine Geburtstagskinder!!!");
	 		}
	 	
	 	System.out.println(" ");
	 	System.out.println("Mitarbeiter mit gleichen Namen:");
	 	
	 	
		for(Mitarbeiter mitarbeiter : mitarbeiter1)
	 	 		
                        /*hier gibt er ja immer true raus und wenn ich dies mit mitarbeiter vergleiche 
                          dann immer false
if(mitarbeiter.equals(mitarbeiter.hasSameName(mitarbeiter)))
*/
	 		if(mitarbeiter.hasSameName(mitarbeiter))
		 			{
		 				System.out.println(mitarbeiter.hasSameName(mitarbeiter)+" "+mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));	
		 			}
	 		else
	 		{
	 			 System.out.println("Keine Mitarbeiter mit gleichen Namen");
	 		}
	 			
	}
}}
```


----------



## zarr (2. Dez 2009)

KrokoDiehl hat gesagt.:


> Willst du jeden Mitarbeiter mit jedem anderen vergleichen? Dann musst du zwei verschachtelte Schleifen nehmen. Natürlich den Fall beachten, dass man sich nicht mit sich selbst vergleicht
> Etwa so:
> 
> ```
> ...




hey genau also den ansatz mit 2 schleifen hab ich auch gehabt nur des letzte nicht danke ^^
war grad dabei des mit den schleifen rum zu experementieren^^ ;-)^^


----------



## zarr (2. Dez 2009)

aja des is glaub ich ne falsche lösung weil ich muss ja die Methode von Mitarbeiter nehmen ;-)


```
for(Mitarbeiter mitarbeiter : mitarbeiter1)
	 		for(Mitarbeiter mitarbeiter2 : mitarbeiter1)
	 			if(mitarbeiter.hasSameName(mitarbeiter)== mitarbeiter2.hasSameName(mitarbeiter2))
	 	 			{
	 	 				System.out.println(mitarbeiter.hasSameName(mitarbeiter)+" "+mitarbeiter.getName()+" "+sdf.format(mitarbeiter.getGeburtstag()));	
	 	 			}
	 			else
	 			{
	 				 System.out.println("Keine Mitarbeiter mit gleichen Namen");
	 			}
```


----------



## w0ddes (2. Dez 2009)

Fast! 
In deiner schreibweise könnte man auf "hasSameName" (theoretisch) verzichten.


```
if(mitarbeiter.hasSameName(mitarbeiter2)
```

das wäre die richtige schreibweise

und dann noch die Falluntersuchung von KrokoDiehl einbringen mit 


```
if(mitarbeiter.hasSameName(mitarbeiter2)
   if(mitarbeiter.equals(mitarbeiter2)){
     System.out.println("Ein und die selbe Person");
     continue;
   }else{
      //hier dann deine Ausgabe / Behandlung
   }
```


----------



## Michael... (2. Dez 2009)

Vielleicht reicht folgendes ja aus, zumal man damit auch weniger Schleifendurchläufe hätte.

```
for (int i=0; i<maList.size(); i++) {
	for (int k=i+1; k<maList.size(); k++) {
		if (maList.get(i).hasSameName(maList.get(k))) {
			System.out.println("Die Mitarbeiter auf Position " + i + " und " + k 
				+ " haben den selben Namen: " + maList.get(i).getName());
		}
	}
}
```


----------



## zarr (2. Dez 2009)

hmm ich glaube wir haben uns falsch verstanden...
also was ich machen will ist ich gebe mitarbeiter ein mit einem Geb-datum.
dann soll es bestimmen die heute geb haben(das funk)
dann soll es aber alle namen ausgeben die gleich sein
z.b. gibt es hans meier 5 mal aber halt verschiedene Personen ud verschiedene geb-datum
und diese will ich ausgeben ;-)

es soll also die ganze liste vergleichen nach doppel vorgekommen namen.


```
´for(Mitarbeiter mitarbeiter : mitarbeiter1)
	 	{
	 		for(Mitarbeiter mitarbeiter2 : mitarbeiter1)
	 		{
	 			if(mitarbeiter.hasSameName(mitarbeiter2))
	 				{
	 				   if(mitarbeiter.equals(mitarbeiter2))
	 				   	{
	 					   System.out.println("Ein und die selbe Person");
	 					   continue;
	 				   	}
	 				   else
	 				   	{
	 					  System.out.println("Keine Mitarbeiter mit gleichen Namen");
	 				   	}
```


----------



## N1klaZ (2. Dez 2009)

Also wenn ich das richtig sehe sind deine beiden if-Anweisungen doppelt vorhanden. Die machen doch genau das gleich oder liege ich da total falsch. Meiner Meinung nach versuchst du das gleich zu machen was Michael... dadrüber dir schon geschrieben hat. Die Ausgabe auf dem Bildschirm kannst du ja beliebig ändern.


----------



## Michael... (2. Dez 2009)

Sortiere doch die Liste nach dem Namen, dann hast Du alle mit gleichem Namen untereinander stehen. Das hilft eventuell bei dem was Du vorhast.


----------



## zarr (2. Dez 2009)

aaaa perfekt dank dir ;-)
so gehts^^ genau so wollt ich dies haben ;-)


```
for (int i=0; i<mitarbeiter1.size(); i++) 
	 	{
	 	    for (int k=i+1; k<mitarbeiter1.size(); k++)
	 	    {
	 	        if (mitarbeiter1.get(i).hasSameName(mitarbeiter1.get(k))) 
	 	        {
	 	            System.out.println("Die Mitarbeiter auf Position " + i + " und " + k 
	 	                + " haben den selben Namen: " + mitarbeiter1.get(i).getName());
	 	            System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag()));
	 	            System.out.println(mitarbeiter1.get(k).getName()+" "+sdf.format(mitarbeiter1.get(k).getGeburtstag()));
	 	        }
	 	    }
	 	}
```

jetzt nur noch dass die ganze liste verglichen muss und nicht nur immer 2 namen


----------



## w0ddes (2. Dez 2009)

jetzt versteh ich leider nicht, was du meinst 
Die Liste wird doch durchlaufen?


----------



## N1klaZ (2. Dez 2009)

Die Schleifen sind dafür da das jeder Name mit jedem anderen Namen verglichen wird.


```
for (int i=0; i<mitarbeiter1.size(); i++) 
        {
            for (int k=i+1; k<mitarbeiter1.size(); k++)
            {
                 // Beim Durchlauf werden alle namen mit dem Namen von (i) Verglichen
                if (mitarbeiter1.get(i).hasSameName(mitarbeiter1.get(k))) 
                {
                   .....
                }
            }
            // Danach wird i um eins erhöht und die Schleife wird erneut durchlaufen
        }
```


----------



## zarr (2. Dez 2009)

w0ddes hat gesagt.:


> jetzt versteh ich leider nicht, was du meinst
> Die Liste wird doch durchlaufen?



ok wenn ich mehere eingaben mache 
z.b. 1. Hans Peter 15.02.2000
      2. Hans Peter 13.08.1999
      3. Gertrude KA 15.03.1885
      4. Hans Peter 08.08.2001

soweit so klar denk ich mal oder?

dann gibt er mir als aus gabe...
Hans Peter 15.02.2000
Hans Peter 13.08.1999
Gertrude KA 15.03.1885
Hans Peter 08.08.2001

-----------------------------
Heutige Geburtstagskinder !!!

Heute keine Geburtstagskinder!!!

Mitarbeiter mit gleichen Namen:
Die Mitarbeiter auf Position 0 und 1 haben den selben Namen: Hans Peter
Hans Peter 15.02.2000
Hans Peter 13.08.1999
Die Mitarbeiter auf Position 0 und 3 haben den selben Namen: Hans Peter
Hans Peter 15.02.2000
Hans Peter 08.08.2001
Die Mitarbeiter auf Position 1 und 3 haben den selben Namen: Hans Peter
Hans Peter 13.08.1999
Hans Peter 08.08.2001

er sollte aber nur ...
Hans Peter 15.02.2000
Hans Peter 13.08.1999
Hans Peter 08.08.2001

...ausgeben ;-)


----------



## zarr (2. Dez 2009)

aa hat sich erledigt ;-)


```
int anz2 = mitarbeiter1.size();
	 	for (int i=0; i<anz2; i++) 
	 	{
	 		System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag()));
	 	
	 	}
```


----------



## w0ddes (2. Dez 2009)

Achso, es geht nur noch um die Ausgabe.. 

Man könnte jedem Mitarbeiter noch eine boolean Variable namens "schonAngezigt" mitgeben. Dadurch kommt es aber zu weiterer verschachtelung und würde das Programm wohl etwas unübersichtlich machen. 

Pseudocode:

```
for (int i=0; i<mitarbeiter1.size(); i++) 
        {
            for (int k=i+1; k<mitarbeiter1.size(); k++)
            {
                if (mitarbeiter1.get(i).hasSameName(mitarbeiter1.get(k))) 
                {
                   if(mitarbeiter.get(i).getSchonAngezeigt != TRUE){
                      System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag()));
                      mitarbeiterl.get(i).setSchonAngezeigt(TRUE);   
                   }
                   if(mitarbeiter.get(i).getSchonAngezeigt != TRUE){
                       System.out.println(mitarbeiter1.get(k).getName()+" "+sdf.format(mitarbeiter1.get(k).getGeburtstag()));
                       mitarbeiterl.get(k).setSchonAngezeigt = TRUE;
                   }
                }
            }
        }
```

so irgendwie könnte es funktionieren. Dazu müsste aber der Klasse Mitarbeiter eine neue Variable sowie  getter und setter zugewiesen werden


----------



## zarr (2. Dez 2009)

kurze frage noch wie kann ich die ausgabe sortieren?
also das zum beispiel die namen die gleich sind untereinander stehen 
z.b. test 01.01.0001
      test 02.02.0002
      test 03.03.0003
     Hans 04.04.0004
     Hans 05.05.0005

und nicht kreuz und quer?


----------



## w0ddes (2. Dez 2009)

Du bringst meinen Kopf ganz schön zum glühen  
(Find ich aber gut, da ich hier auf der Arbeit recht wenig zu tun hab')  

Man könnte die Namen anstatt sie direkt auszugeben in eine Collection speichern und diese dann sortieren:

Hab dafür n Beispiel im "Handbuch der Javaprogrammierung" gefunden


```
001 /* Listing1505.java */
002 
003 import java.util.*;
004 
005 public class Listing1505
006 {
007   public static void main(String[] args)
008   {
009     //Konstruieren des Sets
010     TreeSet s = new TreeSet();
011     s.add("Kiwi");
012     s.add("Kirsche");
013     s.add("Ananas");
014     s.add("Zitrone");
015     s.add("Grapefruit");
016     s.add("Banane");
017     //Sortierte Ausgabe
018     Iterator it = s.iterator();
019     while (it.hasNext()) {
020       System.out.println((String)it.next());
021     }
022   }
023 }
```

Bin auch selbst für andere Vorschläge oder Verbesserungen offen, da ich selbst "nur" Anfänger bin.


----------



## zarr (2. Dez 2009)

w0ddes hat gesagt.:


> Du bringst meinen Kopf ganz schön zum glühen
> (Find ich aber gut, da ich hier auf der Arbeit recht wenig zu tun hab')
> 
> Man könnte die Namen anstatt sie direkt auszugeben in eine Collection speichern und diese dann sortieren:
> ...



hmmm ja ich grübel auch die ganze zeit aber ist richtig geiles gefühl wenn man des dann endlich mal hat und übrigens danke für so schnelle antworten;-)
hmm ja Collection hab ich auch schon grad geschaut^^ aber bei der aufgabe ist es nicht so einfach^^ und mit Collections hab ich nicht so wirklich die erfahrung aber des schaff ma schon ^^
PS: pass auf die aufgabe geht dann noch weiter ;-) ich lass mir noch was überlegen hehe


----------



## w0ddes (2. Dez 2009)

Der vorteil von diesem Treeset ist halt, dass der Iterator das schon alphabetisch sortiert ausgibt. Du hast also eigentlich keine Arbeit mehr.


----------



## zarr (2. Dez 2009)

hmmm ok aber ich weiß nicht wo ich die alles einfügen soll^^


----------



## zarr (2. Dez 2009)

ich hab ne andere lösung ;-) 

Klasse Mitarbeiter

```
public class Mitarbeiter implements Comparable<Mitarbeiter>
...

public int compareTo(Mitarbeiter o) 
{
    return ((String)name).compareTo((String)o.name);
}
```

Klasse MitarbeiterGeb

```
int anz2 = mitarbeiter1.size();
	 	for (int i=0; i<anz2; i++) 
	 		{	
	 		 Collections.sort(mitarbeiter1);
	 	    
	 	    	  {
	 	    		  System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag())+" Position: "+i);
	 	    	  }
	 		
	 		}
```

PS: mist jetzt merks ichs doch das es ja falsch is das er mir ja alle eingaben zurück gibt und nicht alle die namen gleich sind  mit der zeile


```
System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag())+" Position: "+i);
```


----------



## Michael... (2. Dez 2009)

Hier mal ein Bsp. wie man mit Hilfe einer sortierten Liste Mitarbeiter gleichen Namens ausgeben könnte:

```
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MitarbeiterDemo {
	private List<Mitarbeiter> maList;
	
	public static void main(String[] args) {
		new MitarbeiterDemo().showSameNamedEmloyees();
	}

	public void initialiseDummyValues() {
		maList = new ArrayList<Mitarbeiter>();
		maList.add(new Mitarbeiter("Heinz", "19770228"));
		maList.add(new Mitarbeiter("Otto", "19951005"));
		maList.add(new Mitarbeiter("Günther", "19830630"));
		maList.add(new Mitarbeiter("Heinz", "19810113"));
		maList.add(new Mitarbeiter("Karl", "19751113"));
		maList.add(new Mitarbeiter("Heinz", "20000120"));
		maList.add(new Mitarbeiter("Günther", "19650802"));
		maList.add(new Mitarbeiter("Egon", "19811205"));
		maList.add(new Mitarbeiter("Otto", "19910705"));

	}

	public void showSameNamedEmloyees() {
		if (maList == null)
			this.initialiseDummyValues();
		Collections.sort(maList);
		String name = "";
		int index = 0;
		int m;
		for (m = 0; m < maList.size(); m++) {
			if (!name.equals(maList.get(m).getName())) {
				if (m - index > 1) {
					System.out.println("Mitarbeiter mit Namen: " + name);
					printEmployee(index, m);
				}
				name = maList.get(m).getName();
				index = m;
			}
		}
		if (m - index > 1) {
			System.out.println("Mitarbeiter mit Namen: " + name);
			printEmployee(index, m);
		}
	}

	private void printEmployee(int i, int end) {
		for (; i < end; i++) {
			System.out.println(maList.get(i).getName() + " : "
					+ maList.get(i).getBirthDay());
		}
	}

	class Mitarbeiter implements Comparable<Mitarbeiter> {
		private String name;
		private String birthDay;

		public Mitarbeiter(String name, String birthDay) {
			this.name = name;
			this.birthDay = birthDay;
		}

		public boolean hasSameName(Mitarbeiter mitarbeiter) {
			return name.equals(mitarbeiter.getName());
		}

		public String getName() {
			return name;
		}

		public String getBirthDay() {
			return birthDay;
		}

		public int compareTo(Mitarbeiter mitarbeiter) {
			if (!hasSameName(mitarbeiter))
				return name.compareTo(mitarbeiter.getName());
			return birthDay.compareTo(mitarbeiter.getBirthDay());
		}
	}
}
```


----------



## zarr (3. Dez 2009)

hmmm ok aber ich komm nicht klar mit dem code da muss ich ja mein ganzen code um bastln es gibt bestimmt nur eine kleinigkeit;-) ^^


```
for (int i=0; i<mitarbeiter1.size(); i++) 
        {
            for (int k=i+1; k<mitarbeiter1.size(); k++)
            {
                if (mitarbeiter1.get(i).hasSameName(mitarbeiter1.get(k))) 
                {
                    System.out.println("Die Mitarbeiter auf Position " + i + " und " + k 
                        + " haben den selben Namen: " + mitarbeiter1.get(i).getName());
                    System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag()));
                    System.out.println(mitarbeiter1.get(k).getName()+" "+sdf.format(mitarbeiter1.get(k).getGeburtstag()));
                }
            }
        }
```

dies funktioniert eig doch es gibt immer doppelt aus das heißt position 0 und 1 sind gleich und auch 1 und 0 also gibts dies 4 mal aus


----------



## zarr (10. Dez 2009)

hat sich erledigt ^^


```
Collections.sort(mitarbeiter1);
                        Mitarbeiter vorgaenger = null;
                        int namensgleicheVorganger = 0;
                        for (Mitarbeiter m : mitarbeiter1) {
                            if (vorgaenger != null) {
                              if (m.hasSameName(vorgaenger)) {
                                if (++namensgleicheVorganger == 1) {
                                  System.out.println(vorgaenger.getName()+" "+sdf.format(vorgaenger.getGeburtstag()));
                                }
                                System.out.println(m.getName()+" "+sdf.format(m.getGeburtstag()));
                              } else {
                                namensgleicheVorganger = 0;
                              }
                            }
                            vorgaenger = m;
                          }
                        }
```


----------

