# Terminplaner implementieren



## Kira_newbie (22. Okt 2011)

Huhu liebes java-forum. Ich bin ganz neu hier, und hoffe, dass ihr mir hin und wieder ein paar Hilfestellungen geben könnt 

Ich soll einen Terminplaner implementieren, bin aber derzeit noch ziemlich Planlos, wie ich an die Sache rangehen soll.... es sind einfach zu viele Anforderunegn auf einmal...
Es fängt schon damit an, dass es 2 möglichkeiten geben soll einen  neuen Termin zu erzeugen...

Erstellen Sie eine Klasse Termin. Sie soll ein Datum als Tag, Monat und Jahr
und eine Notiz speichern. Es soll zwei Möglichkeiten geben, einen neuen Termin zu erzeugen: Das Datum muss immer angegeben werden; der Notiz-Parameter ist optional.
Fügen Sie der Klasse eine toString()-Methode hinzu, die Datum und Notiz in geeigneter Form als String zurück gibt. Eine weitere Methode soll einen zweiten Termin als Parameter erhalten und als booleanWert zurück geben, ob das Datum des Termins mit dem Datum des übergebenen übereinstimmt.

Implementieren Sie die Klasse Terminplaner. Sie soll Termine als ArrayList<Termin>,
also eine Liste von Terminen, speichern. Verwenden Sie die Java-API-Dokumentation,
um sich mit der Funktionalität der Klasse vertraut zu machen.
Ihre Klasse soll die folgenden Methoden unterstützen:
• Terminplaner(): Konstruktor für den Terminplaner, der die ArrayList initialisiert.
• void neuerTermin(Termin t): Fügt einen Termin hinzu.
• void zeigeTermine(Termin t): Zeigt all diejenigen Termine an, die das selbe Datum wie der übergebene Termin besitzen.
• void zeigeTermine(int ab, int anzahl): Zeigt die übergebene Anzahl von
Terminen ab der übergebenen Indexposition in der Liste an (es handelt sich hierbei nicht um ein Datum). Beachtet, dass innerhalb einer ArrayList das erste Element den Index 0 besitzt.
• void zeigeAlleTermine(): Zeigt alle Termine des Terminplaners an.

Wir haben ein Beispiel dazu gemacht, wie man eine ArrayList verwenden kann:

```
public class Karte
{
    int farbe, wert;
    static int spalten = -1;
    
    public Karte(int farbe, int wert)
    {
        this.farbe = farbe;
        this.wert = wert;
    }
}

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.*;
import java.util.concurrent.*;
import java.io.*;
import javax.imageio.*;


public class Spielbrett extends JFrame
{
	private static final long serialVersionUID = -2219224963313371208L;
	static final double scale = 0.47;
    static final int cardHeight = (int)(215*scale);
    static final int cardWidth = (int)(150*scale);
    static final int leftBorder = 50;
    static final int topBorder = 80;
    static final double gap = 1.3;

    private ArrayList<Karte> cards;
    private BufferedImage images[][];

    private String suits[] = {"spades", "clubs", "hearts", "diamonds"};
    private String values[] = {"seven", "eight", "nine", "ten", "jack", "queen", "king", "ace"};

    public Spielbrett()
    {
        super("Cards by Semicol");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(new Dimension(800, 700));
        setVisible(true);

        images = new BufferedImage[4][8];
        for (int i=0; i<suits.length; ++i)
            for (int j=0; j<values.length; ++j) {
                String fileName = "cards/" + suits[i] + "-";
                fileName += values[j] + ".png";

                try {
                    images[i][j] = ImageIO.read(new File(fileName));
                    //image = ImageIO.read(getClass().getResourceAsStream(fileName));
                } catch (IOException e) {
                    System.out.println("Error while loading image " + fileName);
                }
            }
    }

    public void maleKarten(ArrayList<Karte> cards)
    {
        this.cards = cards;
        repaint();
    }

    public void paint(Graphics g2)
    {
        if (cards == null)
            return;

        BufferedImage offscreen = new BufferedImage(getWidth(), getHeight(),
                                                    BufferedImage.TYPE_3BYTE_BGR);
        Graphics g = offscreen.getGraphics();
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, getWidth(), getHeight());

        for (int i=0; i<cards.size(); ++i) {
            Karte c = cards.get(i);
            drawCard(g, c, i);
        }

        g2.drawImage(offscreen, 0, 0, this);
    }

    private void drawCard(Graphics g, Karte card, int index)
    {
        int numCols = (int)((getWidth() - leftBorder) / (cardWidth*gap));
        if (numCols < 1)
            numCols = 1;
        if (Karte.spalten > 0)
            numCols = Karte.spalten;

        double y = topBorder + (index / numCols) * cardHeight * gap;
        double x = leftBorder + index % numCols * cardWidth * gap;
        g.drawImage(images[card.farbe][card.wert], (int)x, (int)y, cardWidth, cardHeight, null);
    }

    public void warte()
    {
        final CountDownLatch cdl = new CountDownLatch(3);
        KeyEventDispatcher disp = new KeyEventDispatcher()
            {
                public boolean dispatchKeyEvent(KeyEvent e) {
                    cdl.countDown();
                    return false;
                }
            };
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(disp);
        try { cdl.await(); } catch(InterruptedException e) {}
        KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(disp);
    }
}


import java.util.*;

public class Spielkarten 
{
	public static void main(String[] args)
	{
		Spielbrett sb = new Spielbrett();
		
		ArrayList<Karte> stapel = new ArrayList<Karte>();
		for (int farbe=0; farbe<4; farbe++)
			for (int wert=0; wert<8; wert++) {
				Karte k = new Karte(farbe, wert);
				stapel.add(k);
			}
		
		sb.maleKarten(stapel);
		sb.warte();
		
		ArrayList<Karte> gemischt = new ArrayList<Karte>();
		while (stapel.size() > 0) {
			int index = (int)(Math.random() * stapel.size());
			Karte k = stapel.remove(index);
			gemischt.add(k);
		}
		
		sb.maleKarten(gemischt);
	}
}
```


----------



## Gast2 (22. Okt 2011)

Ich sehe nirgends ein ? in deinem Post. 
Bei konkreten Problemen helfen wir dir gerne weiter, Aufgaben lösen tuen wir nicht.


----------



## Kira_newbie (22. Okt 2011)

klar, das verlange ich auch überhaupt nicht von euch, tut mir leid.
also fangen wir mal an. 
1. wie kann ich überahupt einen neuen Termin anlegen? - bzw. wie speichere ich ihn?
2. als 1. lege ich mal Tag, Datum, Monat, Jahr an.
das müsste dan ja aus unserem Beispiel der Schritt sein? 

```
import java.util.*;

public class Spielkarten 
{
	public static void main(String[] args)
	{
		Spielbrett sb = new Spielbrett();
		
		ArrayList<Karte> stapel = new ArrayList<Karte>();
		for (int farbe=0; farbe<4; farbe++)
			for (int wert=0; wert<8; wert++) {
				Karte k = new Karte(farbe, wert);
				stapel.add(k);
			}
		
		sb.maleKarten(stapel);
		sb.warte();
		
		ArrayList<Karte> gemischt = new ArrayList<Karte>();
		while (stapel.size() > 0) {
			int index = (int)(Math.random() * stapel.size());
			Karte k = stapel.remove(index);
			gemischt.add(k);
		}
		
		sb.maleKarten(gemischt);
	}
}[/Java] 
?

3. Später kann ich die einzelnen Tage dan irgendwie in meine ArrayList packen.? bin ich soweit richtig?
```


----------



## Gast2 (22. Okt 2011)

> 1. wie kann ich überahupt einen neuen Termin anlegen?


Indem du z.b. ein neues Termin Objekt erzeugst und ihn dem Terminplaner übergibst.



> bzw. wie speichere ich ihn?


Das bleibt dir überlassen, entweder in einer Datei (wär wohl anfangs das einfachste) oder in einer kleinen Datenbank, z.b. H2 Database Engine.



> 2. als 1. lege ich mal Tag, Datum, Monat, Jahr an.
> das müsste dan ja aus unserem Beispiel der Schritt sein?


Keine Ahnung was du meinst, in dem Code steht ne Menge drin..



> 3. Später kann ich die einzelnen Tage dan irgendwie in meine ArrayList packen.?


Meinst du die Termine? Ja, die kannst du in eine ArrayList<Termin> legen.


----------



## Marco01_809 (22. Okt 2011)

Du kommst aber nicht von Javavideokurs.de oder?


----------



## Kira_newbie (23. Okt 2011)

Marco01_809 hat gesagt.:


> Du kommst aber nicht von Javavideokurs.de oder?


nein komme ich nicht


----------



## Kira_newbie (23. Okt 2011)

okay. also so weit bin ich jetzt mal:

```
public class Termin
{
	int jahr, monat, tag;													//Attribute Jahr, Monat, Tag, Notiz
	String notiz;
	
	public Termin(int jahr, int monat, int tag, String notiz)				//Konstruktor
	{
			this.jahr = jahr;												//Initialisierung
			this.monat = monat;
			this.tag = tag;
			this.notiz = notiz;
	}
{
	}
	 public String toString(){												//toString Methode
	    	String description;
	    	description = "Jahr" + jahr + ", Monat" + monat + ",Tag" + tag;
	    	return description;
	 }
}
```


```
import java.util.*;
import java.util.GregorianCalendar;

public class Terminplaner 
{

				public static void main(String[] args){
					{
						ArrayList<Termin> Termin = new ArrayList<Termin>();				//erstellt ArrayList
						
					/* brauche ich hier eine for Schleife? - wie müsste sie Aussehen? */
						
					/* in einem Lösungsansatz habe ich etwas davon gehört, dass man das Datum mithilfe von
					 * dem java.util.GregorianCalendar speichern soll. wie macht man das? */
						
						Termin a = new Termin (2011, 10, 25, "Funktioniert");			//erstellt neuen Termin
						Termin.add (a);													//speichert neuen Termin in ArrayList
						
		}
	}
}
```

was ich immer noch nicht verstehe... es soll 2 Möglichkeiten geben einen neuen Termin zu erzeugen...?

Eine weitere Methode soll einen zweiten Termin als Parameter erhalten und als boolean-Wert zurück geben, ob das Datum des Termins mit dem Datum des übergebenen übereinstimmt. müsste dan so aussehen? - wie muss ich in meinem Fall a und b nennen?

```
if ( a.equals(b) )   
	return "gleich";
	else "nicht gleich";
```


----------



## Kira_newbie (23. Okt 2011)

wenn ich das mit dem GregorianCalendar amchen will müsste ich doch meine Initalisierung hierdurch ersetzen? :
GregorianCalendar(int jahr, int monat, int tag)


----------



## Gast2 (23. Okt 2011)

> was ich immer noch nicht verstehe... es soll 2 Möglichkeiten geben einen neuen Termin zu erzeugen...?


Eventuell nen zweiten Konstruktor erstellen?



> ArrayList<Termin> Termin = new ArrayList<Termin>();             //erstellt ArrayList


Der Variablenname ist unglücklich gewählt... nenn die Liste doch lieber... termine!



> /* in einem Lösungsansatz habe ich etwas davon gehört, dass man das Datum mithilfe von
> * dem java.util.GregorianCalendar speichern soll. wie macht man das? */


Java Date und Calendar



> Eine weitere Methode soll einen zweiten Termin als Parameter erhalten und als boolean-Wert zurück geben, ob das Datum des Termins mit dem Datum des übergebenen übereinstimmt. müsste dan so aussehen? - wie muss ich in meinem Fall a und b nennen?


Dein Code gibt nen String zurück, es ist aber nen boolean gefordert.
in der Regel überschreibt man die equals Methode der Klasse um sowas zu realisieren.
equals() in Java | ingokallenbach.de


----------



## Kira_newbie (23. Okt 2011)

wieso ist der Name Termin schlecht gewählt? der Name muss der Klassenname sein, und der ist Termin?


----------



## Kira_newbie (23. Okt 2011)

andere Frage. wieso funktioniert das hier nicht?

```
public String toString(){
		 if (notiz == "");	
		 {
		 	String description1;
	    	description1 = "Datum:  " + jahr + "." + monat + "." + tag +  "]" + "      [Notiz:   " + notiz + "]";	    	
	    	return description1;}
	    
		 else
		 	String description2;
	    	description2 = "Datum:  " + jahr + "." + monat + "." + tag +  "]" ;	    	
	    	return description2; 	 }
```


----------



## Marcinek (23. Okt 2011)

Und was funktioniert da nicht?


----------



## 2AndAHalfBit (23. Okt 2011)

Hi, 

ist ja recht lustig hier. 



Kira_newbie hat gesagt.:


> wieso ist der Name Termin schlecht gewählt? der Name muss der Klassenname sein, und der ist Termin?



Der Name ist schlecht gewählt, weil er Singular ist. Collections speichern meinst mehrere Werte, von daher sollte man die Pluralform wählen oder aber kennzeichnen, dass es sich um eine Liste handelt (Termine, TerminList, TerminCollection, ...). 

Zu deiner toString-Methode. Ich sehe auf anhieb die folgenden Fehler:

1. Eine Bedingung wird nicht mit einem ";" abgeschlossen. 
2. Warum verendest du 2 Strings? Du brauchst nur einen, da er semantisch den selben sinn hat. 
3. Du solltest den "+" operator vermeiden.

Grüße


----------



## Gast2 (23. Okt 2011)

> Der Name ist schlecht gewählt, weil er Singular ist. Collections speichern meinst mehrere Werte, von daher sollte man die Pluralform wählen oder aber kennzeichnen, dass es sich um eine Liste handelt (Termine, TerminList, TerminCollection, ...).


Nein, nein. Variablen schreibt man klein!


```
if (notiz == "");
```
Da muss wie schon gesagt das ; am Ende weg, sonst wird die Anweisung direkt beendet und der nächste Block wird ausgeführt.
Außerdem vergleicht man Strings (und Objekte allgemein) mit equals.



> 3. Du solltest den "+" operator vermeiden.


Nein, das ist schon in Ordnung, das wird vom Compiler optimiert. Lediglich in Schleifen sollte man aufpassen, dass man da nicht unnötig String Instanzen erzeugt.


----------



## Kira_newbie (23. Okt 2011)

EikeB hat gesagt.:


> Außerdem vergleicht man Strings (und Objekte allgemein) mit equals.



also ich habe jetzt das ; entfernt und mal == gelassen, funktioniert einwandfrei. mit equals bekomm ich gleich wieder ne fehlermeldung.


----------



## Gast2 (23. Okt 2011)

== ist bei Strings aber schlichtweg falsch. Dass das bei dir jetzt funktioniert ist zufall da der "" String vermutlich im String Pool liegt.
Ersetz einfach 
	
	
	
	





```
if (notiz == "")
```
 durch 
	
	
	
	





```
if (notiz.equals(""))
```


----------



## Kira_newbie (23. Okt 2011)

okay, vielen Dank. Ich habe mich da wohl irgendwie verschrieben... so funktioiert es auch


----------



## hdi (23. Okt 2011)

> also ich habe jetzt [...] mal == gelassen, funktioniert einwandfrei.


Anfängerglück  Hör auf EikeB, da kann ganz schnell etwas rauskommen was du nicht erwartest. Gerade bei Strings ist das mit == übel, da sie Immutable sind und alle Methoden einen _neuen _String zurückliefern. Dann ist dann ganz schnell != einem Literal. Ok, vllt kommen die neuen Strings sogar auch aus dem Pool , aber darüber macht die Doc keine Aussage, also kann man sich nicht darauf verlassen.

Um's einfach zu sagen: == prüft nicht, ob zwei Strings den selben Inhalt haben:


```
String s1 = new String("Hey");
String s2 = new String("Hey");
System.out.println( s1 == s2 );
```

edit too late, aber du solltest das mal testen


----------



## Kira_newbie (23. Okt 2011)

hdi hat gesagt.:


> Anfängerglück  Hör auf EikeB, da kann ganz schnell etwas rauskommen was du nicht erwartest. Gerade bei Strings ist das mit == übel, da sie Immutable sind und alle Methoden einen _neuen _String zurückliefern. Dann ist dann ganz schnell != einem Literal. Ok, vllt kommen die neuen Strings sogar auch aus dem Pool , aber darüber macht die Doc keine Aussage, also kann man sich nicht darauf verlassen.
> 
> Um's einfach zu sagen: == prüft nicht, ob zwei Strings den selben Inhalt haben:
> 
> ...



ja, ich weiß, dass es es irgendwas damit zu tun hat, dass == nur die Gleichheit der Objekte prüft oder so....


----------



## Kira_newbie (23. Okt 2011)

```
GregorianCalendar(int year, int month, int date, String notiz){			//Konstruktor
	
			this.year = year;												//Initialisierung
			this.month = month;
			this.date = date;
			this.notiz = notiz;
```

Return type for the methode is missing?

kann ich die notiz da überhaupt mit reinpacken? wohl eher nicht? was für nen retun type hat GregorianCalendar?


----------



## Gast2 (23. Okt 2011)

Ähm, was genau versuchst du da ???:L
Schreibst du dir da grad ne eigene Klasse GregorianCalendar?


----------



## hdi (23. Okt 2011)

Ja, oder so 

Wenn du's genau und korrekt ausgedrückt wissen willst: == prüft auf *Identität*. Zwei Objekte sind dann, und nur dann, identisch, wenn sie die selbe Referenz haben:


```
Object o1 = new Object();
Object o2 = o1;
```

Allerdings möchte man oft gar nicht auf Identität prüfen, sondern auf _*Gleichheit*_, also nicht Gleichheit aus Sicht des Speichermodells, sondern Gleichheit aus semantischer Sicht auf die Objekte. Und für Gleichheit verwendet man eben equals().


----------



## Kira_newbie (23. Okt 2011)

EikeB hat gesagt.:


> Ähm, was genau versuchst du da ???:L
> Schreibst du dir da grad ne eigene Klasse GregorianCalendar?


wenn ich das nur wüsste 
(siehe Lösungsansatz)
Benutzen sie die Klasse java.util.GregorianCalendar zum Speichern des Datums, eine Notiz ist ein String.

Und das versuche ich gerade einzubauen


----------



## Gast2 (23. Okt 2011)

Du scheinst da aber eine Art Konstruktor schreiben zu wollen...
Statt tag/monat/jahr einzeln zu speichern, speicherst du die drei Angaben in einem GregorianCalendar objekt.

Deine Klasse sieht dann irgendwie so aus:

```
public class Termin {
    private GregorianCalendar date;
    private String note;

    public Termin(int tag, int monat, int jahr, String note) {
        // verarbeiten
    }
}
```


----------



## Marcinek (23. Okt 2011)

Hi,

schon mal dran gedacht ein Buch oder Tutorial zu lesen und da den Aufbau von Klassen und Funktionen zu evaluieren?

Hier läuft so ein Endlosthreadmit jedem kleinen Fehler.

---

Nein du kannst du Konstruktoren nutzen, die es auch gibt. Diesen gibt es nicht.

Der Fehler bezieht sich auf deine Methode, die einen Rückgabewert erwartet es aber keinen gibt.

Gruß,

Martin


----------



## tsitra (23. Okt 2011)

Kira_newbie hat gesagt.:


> ...was für nen retun type hat GregorianCalendar?...



Hallo,

Du zeigst hier einen Konstruktor. Ich hoffe Du vergisst nicht, dass Konstruktoren NIE einen
return-Typ  haben. Da wird rein garnichts angegeben, also auch nicht "void".
(Access modifier dürfen die trotzdem haben...)

Gruß
tsitra


----------



## Kira_newbie (23. Okt 2011)

so. solangsam bekomme ich die Kurve 
habe jetzt mal ein bisschen meinen Grips eingeschalten und das hier zusammengeschrieben: 
(funktioniert soweit auch einwandfrei)


```
public class Termin{
	
	private int jahr,monat,tag;															
	private String notiz;
	
	
	

	public Termin(int tag, int monat, int jahr, String notiz) {							
		 this.jahr = jahr;                                               
         this.monat = monat;
         this.tag = tag;		
		 this.notiz=notiz;
		
	}
		

	
	public String toString(){
    	if (notiz.equals("")){           
    		return "Termin[Datum:  " + jahr + "." + monat + "." + tag +  "]" + "		[Notiz: " + "keine Notiz vorhanden" + " ]";                
        }
    	else
       return "Termin[Datum:  " + jahr + "." + monat + "." + tag +  "]"+ "		[Notiz: " + notiz + " ]";         	
	}
	 
}
```


```
import java.util.*;

public class Terminplaner {

	
	
	private ArrayList<Termin> termine = new ArrayList<Termin>();								
	
	public Terminplaner (){													
	
		Termin a = new Termin (2011, 10, 25, "Funktioniert");								
		termine.add (a);																	
		Termin b = new Termin (2011, 11, 01, "");											
		termine.add (b);		
		
		
		
		printAllTermine();
	}	
	
	public void printAllTermine(){
		for(int i=0;i<termine.size();i++){
			System.out.println(termine.get(i));
		}
	}
		
	public void zeigeTermin (Termin a){		
}
	
public void zeigeAlleTermin (){		
}

public void zeigeTermine (int ab, int anzahl){		
}



public void neuerTermin (Termin a){
	termine.add(a);
	
}
	
	public static void main(String[] args){
			new Terminplaner();		
			
			
			
	}
}
```


----------



## Gast2 (23. Okt 2011)

Nur dass du das Datum in einem GregorianCalendar speichern sollst


----------



## Kira_newbie (23. Okt 2011)

Aufgabenstellung ist ja immernoch folgende:

Erstellen Sie eine Klasse Termin. Sie soll ein Datum als Tag, Monat und Jahr
und eine Notiz speichern. (bis hierhin habe ich es ja schon)  Es soll zwei Möglichkeiten geben, einen neuen Termin zu erzeugen (verwirrt mich immernoch) Das Datum muss immer angegeben werden; der Notiz-Parameter ist optional. (habe ich über die if-Abfrage geregelt)
Fügen Sie der Klasse eine toString()-Methode hinzu, die Datum und Notiz in geeigneter Form als String zurück gibt. (erledigt) Eine weitere Methode soll einen zweiten Termin als Parameter erhalten und als booleanWert zurück geben, ob das Datum des Termins mit dem Datum des übergebenen bereinstimmt. (hier haperts noch etwas)

Implementieren Sie die Klasse Terminplaner. Sie soll Termine als ArrayList<Termin>, also eine Liste von Terminen, speichern. 
Ihre Klasse soll die folgenden Methoden unterstützen:
• Terminplaner(): Konstruktor für den Terminplaner, der die ArrayList initialisiert.
• void neuerTermin(Termin t): Fügt einen Termin hinzu. 
• void zeigeTermine(Termin t): Zeigt all diejenigen Termine an, die das selbe Datum wie der übergebene Termin besitzen.
• void zeigeTermine(int ab, int anzahl): Zeigt die übergebene Anzahl von
Terminen ab der übergebenen Indexposition in der Liste an (es handelt sich hierbei nicht um ein Datum). Beachtet, dass innerhalb einer ArrayList das erste Element den Index 0 besitzt.
• void zeigeAlleTermine(): Zeigt alle Termine des Terminplaners an.

die Methoden habe ich alle eingebaut.
kann mal jemand drüberschauen, ob das so funktioniert?


----------



## Kira_newbie (23. Okt 2011)

EikeB hat gesagt.:


> Nur dass du das Datum in einem GregorianCalendar speichern sollst



also um ehrlich zu sein war der Vorschlag mit dem Gregorian Calendar aus der "gleichen Übung" von 2009 auf meinem Übungsblatt steht es nichtmehr 

und das mit dem GragorianCalendar bekomme ich so nicht hin


----------



## Kira_newbie (23. Okt 2011)

hier hab ich doch was schönes gefunden 

```
import java.util.*;

public class MyDate
{
	GregorianCalendar date;

	public MyDate(int jahr, int monat, int tag)
	{
		date = new GregorianCalendar(jahr, monat-1, tag);
	}
	
	public String toString()
	{
		String result = "" + date.get(Calendar.DAY_OF_MONTH);
		result += "." + (date.get(Calendar.MONTH)+1);
		result += "." + date.get(Calendar.YEAR);
		return result;
	}
	
	public int getDaysPassed()
	{
		GregorianCalendar now = new GregorianCalendar();
		long delay = now.getTimeInMillis() - date.getTimeInMillis();
		delay /= 1000L * 3600L * 24L;
		return (int)delay;
	}
	
	public boolean isSameYear(MyDate other)
	{
		return date.get(Calendar.YEAR) == other.date.get(Calendar.YEAR); 
	}
	
	public static void main(String[] args)
	{
		MyDate datum = new MyDate(2010, 2, 19);
		MyDate d2 = new MyDate(2010, 5, 5);
		System.out.println(datum.isSameYear(d2));
	}
}
```


----------



## Kira_newbie (23. Okt 2011)

also, ich habe mich jetzt dafür entschieden keinen Gregorian zu benutzen, da es nicht ausdrücklich in der Aufgabenstellung steht.
nach meinem Ermessen ist die Aufgabe wie folgt korrekt gelöst. Kann da bitte mal jemand drüberschauen?


```
public class Termin{
	
	private int jahr,monat,tag;															
	private String notiz;

	public Termin(int tag, int monat, int jahr, String notiz) {							
		this.jahr = jahr;                                               
        this.monat = monat;
        this.tag = tag;		
		this.notiz=notiz;		
	}
	
	public String toString(){
    	if (notiz.equals("")){           
    		return "Termin:  " + jahr + "." + monat + "." + tag +"    -      " +"Notiz: keine Notiz vorhanden";              
        }
       return "Termin:  " + jahr + "." + monat + "." + tag +"   -      " +"Notiz: " + notiz;          	
	}	 
	
	public boolean gleicherTag(Termin t){
		return jahr==t.jahr && monat==t.monat && tag==t.tag;
	}
}
```


```
import java.util.*;

public class Terminplaner {	
	
	private ArrayList<Termin> termine = new ArrayList<Termin>();								
	
	public Terminplaner (){	
		
		Termin a = new Termin (2011, 10, 25, "Funktioniert");								
		termine.add (a);																	
		Termin b = new Termin (2011, 11, 01, "");											
		termine.add (b);		
		
		zeigeAlleTermine();
	}	
	
	public void zeigeAlleTermine(){
		for(int i=0;i<termine.size();i++){
			System.out.println(termine.get(i));
		}
	}	
	public void zeigeTermin (Termin a){		
		for(int i=0;i<termine.size();i++){
			if(a.gleicherTag(termine.get(i)))
			System.out.println(termine.get(i));
		}
	}		
	public void neuerTermin (Termin a){
		termine.add(a);		
	}
	public void zeigeTermine (int ab, int anzahl){
		for(int i=ab;i<ab+anzahl;i++){
			System.out.println(termine.get(i));
		}
	}	
	public void neuerTermin(int y, int m, int d, String n) { termine.add(new Termin(y,m,d,n));}

	public static void main(String[] args){
	new Terminplaner();			
			
	}
}
```
dazu nochmal die Aufgabenstellung:
Erstellen Sie eine Klasse Termin. Sie soll ein Datum als Tag, Monat und Jahr und eine Notiz speichern. Es soll zwei Möglichkeiten geben, einen neuen Termin zu erzeugen: Das Datum muss immer angegeben werden; der Notiz-Parameter ist optional.
Fügen Sie der Klasse eine toString()-Methode hinzu, die Datum und Notiz in geeigneter Form als String zurück gibt. Eine weitere Methode soll einen zweiten Termin als Parameter erhalten und als  booleanWert zurück geben, ob das Datum des Termins mit dem Datum des übergebenen übereinstimmt.

Implementieren Sie die Klasse Terminplaner. Sie soll Termine als ArrayList<Termin>, also eine Liste von Terminen, speichern. 
Ihre Klasse soll die folgenden Methoden unterstützen:
• Terminplaner(): Konstruktor für den Terminplaner, der die ArrayList initialisiert.
• void neuerTermin(Termin t): Fügt einen Termin hinzu.
• void zeigeTermine(Termin t): Zeigt all diejenigen Termine an, die das selbe Datum wie der übergebene Termin besitzen.
• void zeigeTermine(int ab, int anzahl): Zeigt die übergebene Anzahl von
Terminen ab der übergebenen Indexposition in der Liste an (es handelt sich hierbei nicht um ein Datum). Beachtet, dass innerhalb einer ArrayList das erste Element den Index 0 besitzt.
• void zeigeAlleTermine(): Zeigt alle Termine des Terminplaners an.


----------



## hdi (23. Okt 2011)

Die Angabe der Notiz beim Erzeugen eines Termins soll optional sein, das ist sie bei dir nicht. Du brauchst einen zweiten Konstruktor, der lediglich das Datum erwartet. Am besten du delegierst in diesem Konstruktor an den völlständigen Konstruktor, wobei du halt einen leeren String als Notiz übergibst:


```
this( ...., "");
```

Weiterhin solltest du in deiner  public void zeigeTermine (int ab, int anzahl) noch eine Fehlerbehandlung einbauen. Es kann sein dass du über die Grenzen der Liste hinausstößt. zB wenn sie nur 5 Termie hat, und man ruft die Methode auf mit (4, 4). Prüfe also, ob ab + anzahl noch innerhalb der Liste liegt, und wenn nein, gib eine Fehlermeldung aus.

Ansonsten nur noch eine Kleinigkeit:
Deine Methode zeigeTermin(Termin a) sollte zeigeTermin*e*(Termin a) heißen  

Der Rest ist richtig, wenn ich mich nicht verkuckt hab.


----------



## Kira_newbie (23. Okt 2011)

okay. also zuerst mal vielen Dank, dass du drüber geschaut hast.
das mit der Optionalen Notiz wollte ich eigentlich mit der If abfrage machen, dass man einfach keine Notiz angibt, wenn man keine hat (über die if abfrage wird dan ein "keine Notiz vorhanden" ausgegeben)

das mit der Fehlermeldung habe ich mir auch schon überlegt, aber ich weiß nicht genau, wie ich das implementieren soll


----------



## hdi (23. Okt 2011)

> das mit der Optionalen Notiz wollte ich eigentlich mit der If abfrage machen, dass man einfach keine Notiz angibt, wenn man keine hat (über die if abfrage wird dan ein "keine Notiz vorhanden" ausgegeben)



Die toString() Methode hat damit nix zu tun. Das ist ja nur die Anzeige einer Notiz, wenn sie bereits erstellt wurde. Aber Fakt ist dein Konstruktor verlangt einen String für die Notiz. Und wenn man halt keine hat, sollte man auch nicht "" oder so übergeben müssen, sondern einfach gar nichts. So ist das gemeint:


```
public Termin(int tag, int monat, int jahr){
      this(tag, monat, jahr, "");
}

public Termin(int tag, int monat, int jahr, String notiz) {                         
      this.jahr = jahr;                                               
      this.monat = monat;
      this.tag = tag;     
      this.notiz=notiz;       
}
```

Es gibt jetzt zwei Konstruktoren. Wenn du eine Notiz hast, kannste den unteren nehmen beim new-Aufruf. Wenn du keine hast, nimmst du den oberen, und musst dafür nix angeben. Intern leitet der dann an den unteren weiter mit einer leeren Notiz ("").



> Das mit der Fehlermeldung habe ich mir auch schon überlegt, aber ich weiß nicht genau, wie ich das implementieren soll


Du weißt, wie ein if-else-Statement aussieht, und du weißt, wie du Text auf der Konsole ausgeben kannst. Wo ist nun das Problem?


----------



## Kira_newbie (23. Okt 2011)

```
public void zeigeTermine (int ab, int anzahl){
		for(int i=ab;i<ab+anzahl;i++){
			if("was muss hier rein?")))
			System.out.println(termine.get(i));
		 	else;
			System.out.printl("Fehler")
```


----------



## hdi (23. Okt 2011)

Das müsstest du doch hinkriegen. Ich glaub es scheitert grad nicht an Java, sondern an Hirn  Na wann ist denn ein get(i) okay, und wann nicht? Ich hab's ja eigentlich auch schon gesagt:


> Es kann sein dass du über die Grenzen der Liste hinausstößt. zB wenn sie nur 5 Termie hat, und man ruft die Methode auf mit (4, 4). *Prüfe also, ob ab + anzahl noch innerhalb der Liste liegt*,


Kannst du das, was in dem Text oben fett gedruckt ist, denn nicht in einen booleschen Java-Ausdruck bringen? Du hast "ab", du hast "anzahl" und du hast die Größe der Liste, aka "size()". Das kriegste doch hin...


----------



## Kira_newbie (23. Okt 2011)

ja das müsste dan in die Richtung     i<termine.size()

sry, aber ich bin echt durch für heute.... nach 7 stunden coden ...


----------



## Kira_newbie (23. Okt 2011)

aber so funktionierts auch nicht so wirklich....

```
public void zeigeTermine (int ab, int anzahl){
		for(int i=ab;i<ab+anzahl;i++){
			if( i<termine.size()))
			System.out.println(termine.get(i));
		 	else;
			System.out.printl("Fehler");
```


----------



## hdi (23. Okt 2011)

else*;*

Wenn du das ; rausnimmst funktioniert es. Naja, kommt halt drauf an was man anzeigen will. Am einfachsten isses wohl, du brichst ab, sobald du über's Ziel hinausschießt:


```
for(int i=ab;i<ab+anzahl;i++){
            if( i<termine.size()))
               System.out.println(termine.get(i));
            else{
               return;
            }
         }
```


----------



## Kira_newbie (23. Okt 2011)

vielen Dank 
endlich fertig :applaus::applaus::toll:


----------



## Baum17 (25. Okt 2011)

lol so eine aufgabe musste ich auch machen. Danke fuer die hilfe!


----------



## Goodyear (25. Okt 2011)

Na wenn das mal keinen Ärger mit dem Benny gibt...


----------



## Baum17 (25. Okt 2011)

wer ist benny? (lol)


----------



## 2AndAHalfBit (26. Okt 2011)

Hi, 

also ich möchte ja nicht fies zu dir sein. Deshalb versuche ich es mal höflich zu formulieren. Ich hoffe du fasst es auch so auf. 

Es bringt dir nichts, wenn wir dir deine Compiler-Errors bereinigen. Man sieht ganz deutlich, dass du eklatante Schwächen hast. Besorg dir ein Java-Anfängerbuch und arbeitete es durch. So wie es aussieht fehlt dir generell das Grundverständnis über die Infrastruktur einen jeden Computerprogramms. 

Ich nehme an, dein letzter Post soll eine Methode sein, die einen initialisierten Kalender zurückgibt. Eine solche Methode muss auch etwas zurückgeben, das heisst es fehlt ein Return-Statement. 

Grüße,


----------



## Baum17 (26. Okt 2011)

Mein tutor hat mir heute mitgeteilt, dass ich 0 Punkte fuer die aufgabe habe


----------



## Gossi (26. Okt 2011)

Baum17 hat gesagt.:


> Mein tutor hat mir heute mitgeteilt, dass ich 0 Punkte fuer die aufgabe habe



Vielleicht war deine Aufgabenstellung minimal anders?
Und, sorry wenn das falsch rüberkommt, aber du hast, so wie ich das Lese/Verstehe, nun stumpf den Code von hier Kopiert und selber nichts geschrieben, falls das der Fall ist, hast du es eigentlich auch nicht anders verdient


----------



## Kira_newbie (26. Okt 2011)

Baum17 bitte sag mir, dass du wo anderst studierst als ich!


----------



## Marcinek (26. Okt 2011)

Kira_newbie hat gesagt.:


> Baum17 bitte sag mir, dass du wo anderst studierst als ich!



Bitte sag mir, dass ihr kein Informatik studiert ;D

scnr


----------



## Kira_newbie (28. Okt 2011)

Marcinek hat gesagt.:


> Bitte sag mir, dass ihr kein Informatik studiert ;D
> 
> scnr


da muss ich dich leider enttäuschen


----------

