# Implementierung eines Terminplans in Java



## PPhilipp (9. Juni 2004)

Hi Leute,

Habt ihr zufällig ne kleine Hilfestellung wie ich ein Terminplan mit folgenden Operationen implementieren kann

- Termin eintragen
- Termin löschen
- Terminkollision bemerken
- Menge der freien Termine innerhalb eines Zeitraums


----------



## Snape (9. Juni 2004)

> _Original geschrieben von PPhilipp _
> *Hi Leute,
> 
> Habt ihr zufällig ne kleine Hilfestellung wie ich ein Terminplan mit folgenden Operationen implementieren kann
> ...



- ArrayList in der Hauptklasse anlegen
- Klasse "Termin" anlegen mit Variablen für Aktion, Datum, Uhrzeit, ...
- für jeden neuen Termin ein neues Objekt "Termin" anlegen mit den erforderlichen Daten und in die o.a. ArrayList ablegen
- zu löschenden Termin bedeutet dann: "Termin"-Objekt aus der ArrayList löschen
- Terminkollision bemerken durch Durchsuchen der ArrayList und Vergleich der enthaltenen "Termin"-Objekte auf gleiches Datum/Uhrzeit
- Menge der freien Termine durch Eingrenzung Datum/Uhrzeit kleiner/größer untere/obere Zeitraumgrenze herausfinden.


----------



## PPhilipp (13. Juni 2004)

Danke erstmal an Snape für den Ansatz!

Ich hab hier jetzt so was geschrieben:


public class Termin {



	int tag, monat, jahr, stunde, minute;
	  String notiz;

	  public Termin()
	  {
		 tag = 13;
		 monat = 6;
		 jahr = 2004;
		 stunde = 22;
		 minute = 02;
		 notiz = "";
	  }

	  public void ausgeben()
	  {
		 System.out.println();
		 System.out.println(tag + "." + monat + "." + jahr + "   " + stunde + " Uhr " + minute + "  :" + notiz);
		 System.out.println();
	  }

	  public boolean gleicherTag(Termin vergleichstermin)
	  {
		 return (vergleichstermin.tag == tag) &&
				(vergleichstermin.monat == monat) &&
				(vergleichstermin.jahr == jahr) &&
				(vergleichstermin.stunde == stunde) &&
				(vergleichstermin.minute == minute);
	  }

	  public void uebertragen(Termin alterTermin)
	  {
		 notiz = notiz + "\n" + alterTermin.notiz;
		 alterTermin.notiz = "";
	  }


	  public static void main(String[] argv)
	  {
		 Termin eins, zwei;

		 eins = new Termin();
		 zwei = new Termin();

		 eins.tag = 16;
		 eins.monat = 6;
		 eins.jahr = 2004;
		 eins.stunde = 11;
		 eins.minute = 0;
		 eins.notiz = "Fußball";

		 zwei.tag = 16;
		 zwei.monat = 6;
		 zwei.jahr = 2004;
		 zwei.stunde = 11;
		 zwei.minute = 0;
		 zwei.notiz = "Essen";

		 eins.ausgeben();
		 zwei.ausgeben();


		 if (eins.gleicherTag(zwei))
			System.out.println("Beide Ereignisse zeitgleich");
		 else
			System.out.println("Ereignisse zu unterschiedlichen Zeiten");

		 zwei.uebertragen(eins);
		 zwei.ausgeben();
	  }
   }



Wie schaffe ich jetzt genau die Menge der freien Termine suchen zu lassen und Termine zu löschen?

Sorry, kann nicht gut programmieren aber der obige Quellcode funktioniert schonmal.


----------



## Snape (14. Juni 2004)

Moin,
füge der Klasse Termin noch eine Variable "datum" vom Typ Date hinzu, welche das komplette und vor allem vergleichbare Datum enthält.
GregorianCalendar ist übrigens eine recht nützliche Klasse zum Arbeiten mit Daten.

BTW am Programmierstil solltest Du noch etwas arbeiten...


----------



## PPhilipp (20. Juni 2004)

So, ich hab das ganze jetzt nochmal neu gemacht bzw. versucht.
Ich habe 2 Klassen erstellt, einmal Termin:


public class Termin {
	Datum anfang;
	Datum ende;

	protected Termin(String anf, String end) {
		anfang = new Datum(anf);
		ende = new Datum(end);
	}

	public boolean kollidiert(Termin t) {
		if (anfang.compareTo(t.getAnfang()) == -1
			|| anfang.compareTo(t.getAnfang()) == 0) {
			if (ende.compareTo(t.getAnfang()) == 1) {
				return true;
			} else {
				return false;
			}
		} else {
			return t.kollidiert(this);
		}
	}

	public Datum getAnfang() {
		return anfang;
	}

	public Datum getEnde() {
		return ende;
	}

	public String toString(){
		return "Anfang: "+anfang.toString()+" Ende: "+ende.toString();
	}

	public static void main(String[] args) {
		Termin t1 = new Termin("15.06.2004 11:00","15.06.2004 13:00");
		Termin t2 = new Termin("15.06.2004 14:30","15.06.2004 19:23");
		Termin t3 = new Termin("15.06.2004 12:00","15.06.2004 14:00");
		System.out.println(t1.kollidiert(t2));
		System.out.println(t2.kollidiert(t1));
		System.out.println(t1.kollidiert(t3));
		System.out.println(t3.kollidiert(t1));
	}

}


und zum anderen Datum:

import java.util.Calendar;
import java.util.StringTokenizer;

public class Datum implements Comparable {

	private Calendar datum;
	protected int stunde, minute;

	protected Datum(String dat) {
		datum = Calendar.getInstance();
		datum.set(Calendar.AM_PM,Calendar.AM);
		datumParsen(dat);
	}

	private void datumParsen(String d) {
		StringTokenizer st = new StringTokenizer(d, ". :");
		int tag = Integer.parseInt(st.nextToken());
		int monat = Integer.parseInt(st.nextToken());
		int jahr = Integer.parseInt(st.nextToken());
		stunde = Integer.parseInt(st.nextToken());
		minute = Integer.parseInt(st.nextToken());
		datum.set(jahr, monat, tag);
	}

	public int compareTo(Object o) {
		if (o instanceof Datum) {
			Datum d = (Datum) o;
			if (datum.get(Calendar.YEAR) < d.getDatum().get(Calendar.YEAR))
				return -1;
			if(datum.get(Calendar.YEAR) > d.getDatum().get(Calendar.YEAR))
				return 1;
			if(datum.get(Calendar.MONTH) < d.getDatum().get(Calendar.MONTH))
				return -1;
			if(datum.get(Calendar.MONTH) > d.getDatum().get(Calendar.MONTH))
				return 1;
			if(datum.get(Calendar.DAY_OF_MONTH) < d.getDatum().get(Calendar.DAY_OF_MONTH))
				return -1;
			if(datum.get(Calendar.DAY_OF_MONTH) > d.getDatum().get(Calendar.DAY_OF_MONTH))
				return 1;
			if (stunde < d.getStunde())
				return -1;
			if(stunde > d.getStunde())
				return 1;
			if(minute < d.getMinute())
				return -1;
			if (minute > d.getMinute())
				return 1;
		}
		return 0;
	}

	public String toString() {
		String min = ""+minute;
		if (minute <10) min ="0"+minute ;
		return datum.get(Calendar.DAY_OF_MONTH)
			+ "."
			+ datum.get(Calendar.MONTH)
			+ "."
			+ datum.get(Calendar.YEAR)
			+ " "
			+ stunde
			+ ":"
			+ min;
	}


	protected Calendar getDatum() {
		return datum;
	}


	protected int getMinute() {
		return minute;
	}


	protected int getStunde() {
		return stunde;
	}

}


Was haltet ihr davon? oder sollte ich da nochwas ändern

Jetzt fehlt mir nur noch die Klasse "Terminplan" mit Termin eintragen, löschen und freie Termine suchen.
Da habe ich noch ziemliche Probleme bei.


----------



## PPhilipp (21. Juni 2004)

Könnte "Terminplan" so aussehen bin mir nicht sicher



import java.util.Iterator;
import java.util.Vector;



/public class Terminplan {

	private Vector Termine;

	protected Terminplan() {
		Termine = new Vector();
	}

	public void eintragen(Termin t) {
		if(frei(t)) Termine.add(t);
	}

	public void loeschen(Termin t) throws Exception{
		if(Termine.isEmpty()) throw new Exception();
		else Termine.remove(t);
	}

	public boolean frei(Termin t){
		boolean antwort = true;
		if(Termine.isEmpty());
		else{
			for(Iterator it = Termine.iterator(); it.hasNext(){
				if(((Termin)it.next()).kollidiert(t)){
					antwort = false;
					break;
				}
			}
		}
		return antwort;
	}

	public Terminplan freieTermineImZeitraum(Termin von, Termin bis, Terminplan neu){
		//TODO: Frei Termine im angegeben Zeitraum suchen und in antwort eintragen;
		Terminplan antwort = neu;
		return antwort;
	}

	public static void main(String args[]) throws java.text.ParseException{
		Termin t1 = new Termin("15.06.2004 11:00","15.06.2004 13:00");
		Termin t2 = new Termin("15.06.2004 14:30","15.06.2004 19:23");
		Termin t3 = new Termin("15.06.2004 12:00","15.06.2004 14:00");
		Terminplan tp = new Terminplan();
		tp.eintragen(t1);
		System.out.println(tp.frei(t2));
		System.out.println(tp.frei(t3));
	}
}


----------

