Transport Manager

Status
Nicht offen für weitere Antworten.

Baa

Mitglied
Hi
ich habe eine kleine Aufgabe bekommen
und komme damit nicht klar , weil ich nicht so gut in Java bin


Transport Manager

Gesamtziel
Ziel dieses Aufgabenblocks ist es, eine Datenhaltung eines (australischen) Fuhrunternehmens zu implementieren. Das Unternehmen möchte die Fahrten (Aufträge) der verfügbaren Fahrzeuge (Kühltrucks, Tiertransporter usw.) mithilfe einer zentralen Datenhaltung verwalten können.
Die Wiederverwendung bereits implementierter Klassen ist dabei vorgesehen. Sollten in späteren Teilaufgaben Klassen aus vorherigen Aufgabenteilen benötigt werden, werden diese jedoch NICHT zur Verfügung gestellt. Das heißt spätestens dann sollten Ihre eigenen Klassen lauffähig sein.

Zeitpunkte
Zwischenziel: Verwendung von Java-Bibliotheksklassen, Entwurfsmuster Adapter

Zum Einstieg, beginnen wir mit einer Klasse für die Darstellung von Zeitpunkten. Jede spätere Fahrt/Auslieferung findet zu einem bestimmten Zeitpunkt, der sich aus einem Datum und einer Zeitangabe (Stunden und Minuten) zusammensetzt, statt.
Dabei soll die Java-Bibliotheksklasse java.util.GregorianCalendar mithilfe des Entwurfsmusters Adapter gekapselt werden, um genau nur die Schnittstelle zur Verfügung zu stellen, die im Rahmen dieser Aufgabe benötigt wird. Konkret bedeutet das, dass die Klasse CustomDate ein Attribut vom Typ GregorianCalendar besitzt, welches eine Referenz auf eine Instanz von GregorianCalendar darstellt. Berechnungen werden über dieses Attribut an die Klasse GregorianCalendar delegiert.

Erstellen Sie die öffentliche Klasse CustomDate im Paket jpp.tourManager.date welche das Interface java.lang.Comparable< CustomDate > implementiert. Diese Klasse modelliert einen Zeitpunkt indem sie eine Instanz der Klasse GregorianCalendar kapselt und Anfragen an dieses Objekt weiterleitet.
Sie soll neben dem Referenz-Attribut vom Typ GregorianCalendar mindestens die folgende Schnittstelle bereitstellen:

*
public CustomDate()
Default-Konstruktor; erzeugt ein neues Default-Zeitpunkt-Objekt. Dafür wird das GregorianCalendar Attribut initialisiert. Als Default-Zeitpunkt gilt immer das aktuelle Datum und der Zeitpunkt der Initialisierung.
*
public CustomDate(java.util.Date other)
Konstruktor; erzeugt ein neues Zeitpunkt-Objekt. Dafür wird das GregorianCalendar Attribut mit den Werten aus other initialisiert. Sie dürfen hier davon ausgehen, dass nur gültige Date-Objekte übergeben werden, dh. es müssen keine Ausnahmen abgefangen werden.
*
public CustomDate (int year, int month, int day, int hour, int minute)
erzeugt ein neues Zeitpunkt-Objekt. Dafür wird das GregorianCalendar Attribut mit den übergebenen Werten initialisiert Sie dürfen hier davon ausgehen, dass nur gültige Werte übergeben werden, dh. es müssen keine Ausnahmen abgefangen werden.
*
public boolean isLeapYear ( int year )
gibt true zurück, wenn year ein Schaltjahr ist. Delegieren Sie den Methodenaufruf an das GregorianCalendar Objekt. Dabei soll bei year = 0 grundsätzlich false zurückgegeben werden.
Hinweis: GregorianCalendar gibt hier standardmäßig true zurück!
*
public boolean equalsDayOnly ( CustomDate other )
liefert, ob zwei Zeitpunkt-Objekte auf den gleichen Zeitpunkt (keine Referenzgleichheit!) verweisen. In dieser Variante soll die Uhrzeit unberücksichtigt bleiben, dh 02.05.2009 16:30h und 02.05.2009 18:01 gelten als gleich! Behandeln Sie den Fall, dass other null sein kann. Delegieren Sie den Methodenaufruf in geeigneter Weise an GregorianCalendar.
Hinweis: GregorianCalendar vergleicht Zeitpunkte IMMER einschließlich der Uhrzeit!
*
public boolean equals(Object obj)
liefert, ob zwei Zeitpunkt-Objekte auf den gleichen Zeitpunkt (Jahr, Monat, Tag, Stunde und Minute) verweisen. Diesmal soll auch die Uhrzeit berücksichtigt werden. Behandeln Sie den Fall, dass other null oder von einem anderen Typ sein kann gemäß der Definition in java.lang.Object. Delegieren Sie den Methodenaufruf in geeigneter Weise an GregorianCalendar.
*
public int hashCode( )
berechnet einen Hashcode für eine Instanz der Klasse CustomDate. Beachten Sie hier die Definition gemäß java.lang.Object.
*
public int compareTo(CustomDate o)
vergleicht zwei Instanzen der Klasse CustomDate. Beachten Sie hier die Definition gemäß java.lang.Comparable und achten Sie auf Konsistenz mit der Methode equals(Object).
*
public boolean before ( CustomDate other )
gibt true zurück, wenn der Zeitpunkt des aufrufenden Objektes vor dem Zeitpunkt other liegt, false sonst. Delegieren Sie den Methodenaufruf in geeigneter Weise an GregorianCalendar.
*
public boolean after ( CustomDate other )
gibt true zurück, wenn das Zeitpunkt des aufrufenden Objekts nach other liegt, false sonst. Delegieren Sie den Methodenaufruf in geeigneter Weise an GregorianCalendar.
*
public String toString ( )
liefert eine String-Repräsentation des aufrufenden Objekts nach folgender Regel: Wochentag, Tag.Monat.Jahr(4-stellig) Stunde:Minute AM/PM. Ein beispielhaft formatierter Zeitpunkt ist Friday, 05.06.2009 10:00 PM
Hinweis: Verwenden Sie die Klasse java.text.SimpleDateFormat sowie Locale.ENGLISH in geeigneter Weise.
*
public void addMinutes ( int value ) / public void addHours ( int value ) / public void addDays ( int value )
Schreiben Sie jeweils eine Methode, welche value zu den Minuten, Stunden oder Tagen eines Zeitpunktes hinzuaddiert. Delegieren Sie den Methodenaufruf an GregorianCalendar.
*
public int getYear ( ) / public int getMonth ( ) / public int getDay ( ) / public int getHour ( ) / public int getMinute ( )
Schreiben Sie jeweils eine Methode, welche Wert für Jahr, Monat, Tag, Stunde und Minute einzeln zurückgibt. Delegieren Sie den Methodenaufruf an GregorianCalendar.
*
public GregorianCalendar getDateRep ( )
Diese Methode liefert das Referenzobjekt auf GregorianCalendar.

Hinweis: Beachten Sie eine Besonderheit von GregorianCalendar - diese Klasse führt die Monatszählung (und NUR die Monatszählung!!!) 0-basiert durch. Das heißt, eine Übergabe von 1 als Monat erzeugt bereits den Monat FEBRUAR!.
In der Implementierung von CustomDate soll jedoch die Monatszählung ganz 'normal' erfolgen, d.h. bei einer Übergabe von 1 soll der Monat JANUAR erzeugt werden. Finden Sie ein geeignetes Workaround. Dies betrifft vor allem die Methoden zum auslesen des Monats bzw der Erzeugung einer geeigneten String-Repräsentation.




kann mir jamand beim starten helfen ?!!!!
 

Ariol

Top Contributor
Hier, damit du mal einen Anfang hast:

Java:
public class CustomDate implements java.lang.Comparable<CustomDate>
{
	private GregorianCalendar	calendar;

	public CustomDate()
	{
		calendar = new GregorianCalendar();
	}

	public CustomDate(Date other)
	{
		calendar = new GregorianCalendar();
		calendar.setTime(other);
	}

	public CustomDate(int year, int month, int day, int hour, int minute)
	{
		calendar = new GregorianCalendar(year, month-1, day, hour, minute);
	}

        ....
}
 

Ariol

Top Contributor
...und den Rest dieser enormen Aufgabenstellung hat Baa jetzt selbst hinbekommen? :)

Keine Ahnung :confused: Er hat sich zumindest nicht mehr gemeldet.

Außerdem ist die Aufgabenstellung nicht enorm - ich hab für weitere Anfragen die Lösung hier rumliegen (zumindest die ungetestete ;-))


  • Viele Methoden sind so oder so ähnlich eh in der GregorianCalendar-Klasse drin. Man muss nur Kleinigkeiten anpassen. (Monat -1/+1 bei Ein/Ausgabe)
  • Die anderen Methoden sind einfache Vergleiche (Wenn Jahr von 1 gleich Jahr von 2 und Monat von 1 ....)
 

Baa

Mitglied
hi

ich habe nicht mehr weiter gemacht
ich musste andere Aufgaben machen :eek:
aber morgen muss ich weiter machen und dann gucke ich ob ich noch hilfe brauche

ciao
danke
 
das problem ist, dass ich immer wieder null pointer bekomm.

hier mal mein Code, den ich dazu geschrieben hab, vielleicht fällt der fehler auf, ich starr jetzt stunden drauf und mir kommts net in den Sinn, wo es hängt!

package jpp.tourManager.date;

import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
import java.lang.Comparable;

public class CustomDate {
private Calendar calendar;
private CustomDate other;
private Date date;
private int year;
private int month;
private int day;
private int stunden;
private int minute;
private int second;

/**
* Diese Methode liefert das Referenzobjekt auf GregorianCalendar
*
* @return
*/
public java.util.Calendar getDateRep() {
calendar = new GregorianCalendar();
date = new Date();
calendar.setTime(date);

return calendar;
}

/**
* Default-Konstruktor; erzeugt ein neues Default-Zeitpunkt-Objekt. Dafür
* wird das GregorianCalendar Attribut initialisiert. Als Default-Zeitpunkt
* gilt immer das aktuelle Datum und der Zeitpunkt der Initialisierung.
*/
public CustomDate() {
calendar = new GregorianCalendar();
}

/**
* Konstruktor; erzeugt ein neues Zeitpunkt-Objekt. Dafuer wird das
* GregorianCalendar Attribut mit den Werten aus other initialisiert.
*
* @param other
*/
public CustomDate(java.util.Date other) {
calendar = new GregorianCalendar();
calendar.setTime(other);
}

/**
* Erzeugt ein neues Zeitpunkt-Objekt. Dafür wird das GregorianCalendar
* Attribut mit den uebergebenen Werten initialisiert
*
* @param year
* @param month
* @param day
* @param hour
* @param minute
*/
public CustomDate(int year, int month, int day, int hour, int minute) {
this.year = year;
this.month = month;
this.day = day;
this.stunden = hour;
this.minute = minute;
calendar = new GregorianCalendar();
calendar.set(this.year, this.month - 1, this.day, this.stunden,
this.minute);
}

/**
* gibt year zurueck
*
* @return
*/
public int getYear() {
return calendar.get(year);
}

/**
* gibt Monat zurueck
*
* @return
*/
public int getMonth() {
return calendar.get(month);
}

/**
* gibt Tage zurueck
*
* @return
*/
public int getDay() {
return calendar.get(day);
}

/**
* gibt Stunden an day System zurueck
*
* @return
*/
public int getHour() {
return calendar.get(stunden);
}

/**
* gibt Minuten an das System zurueck
*
* @return
*/
public int getMinute() {
return calendar.get(minute);
}

/**
* fuegt den uebergebenen Wert Value zu Minuten hinzu.
*
* @param value
*/
public void addMinutes(int value) {
calendar.add(value, minute);
}

/**
* fuegt Value zu den Stunden hinzu.
*
* @param value
*/
public void addHours(int value) {
calendar.add(value, stunden);
}

/**
* fuegt value zu dem Wert day hinzu.
*
* @param value
*/
public void addDays(int value) {
calendar.add(value, day);
}

/**
* gibt true zurueck, wenn year ein Schaltjahr ist.
*
* @param year
* @return
*/
public boolean isLeapYear(int year) {
if (calendar.get(year) == 0)
return false;
else if (calendar.get(year) % 4 == 0)
return true;
else
return false;

}

/**
* liefert, ob zwei Zeitpunkt-Objekte auf den gleichen Zeitpunkt verweisen
*
* @param other
* @return
*/
public boolean equalsDayOnly(CustomDate other) {
if (other == null) {
throw new IllegalArgumentException("Fehlerhafter Wert uebergeben");
}

calendar.set(this.year, this.month, this.day);

if (calendar.equals(other))
return true;
else
return false;
}

/**
* liefert, ob zwei Zeitpunkt-Objekte auf den selben Zeitpunkt verweisen.
*/
public boolean equals(Object o) {
if (o == null || o.getClass() != this.getClass()) {
throw new IllegalArgumentException("Fehlerhafte Werte uebergeben");
}
calendar
.set(this.year, this.month, this.day, this.stunden, this.minute);
if (o == calendar)
return true;
else
return false;

}

/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((calendar == null) ? 0 : calendar.hashCode());
result = prime * result + ((date == null) ? 0 : date.hashCode());
result = prime * result + day;
result = prime * result + minute;
result = prime * result + month;
result = prime * result + second;
result = prime * result + stunden;
result = prime * result + year;
return result;
}

/**
* vergleicht zwei instanzen der Klasse CustomDate
*
* @param o
* @return
*/
public int compareTo(CustomDate o) {
int result = 1;
if (o.equals(other))
return result;
return 0;

}

/**
* gibt true zurueck, wenn der Zeitpunkt des aufrufenden Objektes vor other
* liegt, sonst false.
*
* @param other
* @return
*/
public boolean before(CustomDate other) {
calendar.setTime(date);
if (calendar.before(other))
return true;
else
return false;
}

/**
* gibt true zurueck, wenn der Zeitpunkt des aufrufenden Objektes nach other
* liegt, sonst false.
*
* @param other
* @return
*/
public boolean after(CustomDate other) {
calendar.setTime(date);
if (calendar.after(other))
return true;
else
return false;

}

/**
* liefert eine String-Repraesentation des auftretenden Objekts.
*/
public String toString() {
SimpleDateFormat Ausgabe = new SimpleDateFormat(
"EEEEEEEEEEE, dd.MM.yyyy hh:mm aaa");
return Ausgabe.format(date);

}

}

Danke
 

Ariol

Top Contributor
Könntest du das ganze mal in
Java:
-Tags fassen, dann kann man den Code besser lesen.

Weiterhin:

Diese Attribute brauchst du nicht:
[code=Java]

private CustomDate other;
private Date date;
private int year;
private int month;
private int day;
private int stunden;
private int minute;
private int second;

Das SimpleDate-Format sollte mit
Java:
	public String toString()
	{
		SimpleDateFormat sdf = new SimpleDateFormat("E, dd.MM.yyyy hh a", Locale.ENGLISH);
		return sdf.format(calendar.getTime());
	}
das ausgeben, was du brauchst.

isLeapYear geht so einfacher:
Java:
public boolean isLeapYear(int year)
	{
		if (year == 0)
			return false;
		return calendar.isLeapYear(year);
	}
Bei dir fehlt da außerdem die Abfrage ob das Jahr durch 100 bzw. 400 teilbar ist. Dort gibt es Sonderregeln.

Ach ja, poste auch mal die Ausgabe der NullPointerException (in
Code:
-Tags)
 
Zuletzt bearbeitet:
so sehn die fehlermeldungen aus:

1Test(s) saved.
Compilation successful.
Testsuite: level_1.TestCustomDate
Tests run:10, Failures: 3, Errors: 7, Time elapsed: 0.098 sec

Testcase: testConstructorsAndToString took 0.019 sec
FAILED
Date (Year) ist not initialized correctly. expected:<2009> but was:<1>
junit.framework.AssertionFailedError: Date (Year) ist not initialized correctly. expected:<2009> but was:<1>
at level_1.TestCustomDate.testConstructorsAndToString(TestCustomDate.java:37)

Testcase: testIsLeapYear took 0.001 sec
Caused an ERROR
1996
java.lang.ArrayIndexOutOfBoundsException: 1996
at java.util.Calendar.internalGet(Calendar.java:1140)
at java.util.Calendar.get(Calendar.java:1127)
at jpp.tourManager.date.CustomDate.isLeapYear(CustomDate.java:153)
at level_1.TestCustomDate.testIsLeapYear(TestCustomDate.java:70)

Testcase: testEqualsDayOnly took 0.004 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at level_1.TestCustomDate.testEqualsDayOnly(TestCustomDate.java:83)

Testcase: testEquals took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at level_1.TestCustomDate.testEquals(TestCustomDate.java:118)

Testcase: testBefore took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at level_1.TestCustomDate.testBefore(TestCustomDate.java:143)

Testcase: testAfter took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at level_1.TestCustomDate.testAfter(TestCustomDate.java:168)

Testcase: testToString took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at level_1.TestCustomDate.testToString(TestCustomDate.java:201)

Testcase: testAdders took 0.003 sec
FAILED
addMinutes is not correct. expected:<10> but was:<1>
junit.framework.AssertionFailedError: addMinutes is not correct. expected:<10> but was:<1>
at level_1.TestCustomDate.testAdders(TestCustomDate.java:212)

Testcase: testGetters took 0.002 sec
FAILED
getMinute is not correct. expected:<10> but was:<1>
junit.framework.AssertionFailedError: getMinute is not correct. expected:<10> but was:<1>
at level_1.TestCustomDate.testGetters(TestCustomDate.java:260)

Testcase: testCompareTo took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1070)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:858)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:851)
at java.text.DateFormat.format(DateFormat.java:316)
at jpp.tourManager.date.CustomDate.toString(CustomDate.java:269)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at level_1.TestCustomDate.testCompareTo(TestCustomDate.java:273)

Das gibt mir die testsuite aktuell aus, sind verschiedene tests auf so ziemlich alles...
daher weiß ich auch nich genau wo der fehler liegen soll!!
und wie geb ich hier in code tags aus?? bin ganz neu in sowas:)
 

Ariol

Top Contributor
Naja, dann poste ich doch mal meine Lösung...

Java:
package jpp.tourManager.date;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CustomDate implements java.lang.Comparable<CustomDate>
{
	private GregorianCalendar	calendar;

	public CustomDate()
	{
		calendar = new GregorianCalendar();
	}

	public CustomDate(Date other)
	{
		calendar = new GregorianCalendar();
		calendar.setTime(other);
	}

	public CustomDate(int year, int month, int day, int hour, int minute)
	{
		calendar = new GregorianCalendar(year, month-1, day, hour, minute);
	}

	public boolean isLeapYear(int year)
	{
		if (year == 0)
			return false;
		return calendar.isLeapYear(year);
	}

	public boolean equalsDayOnly(CustomDate other)
	{
		boolean yearEqual = getYear()==other.getYear();
		boolean monthEqual = getHour()==other.getHour();
		boolean dayEqual = getDay()==other.getDay();
		
		return yearEqual && monthEqual && dayEqual;		
	}

	public boolean equals(Object obj)
	{
		if (obj == null || !(obj instanceof CustomDate))
			return false;
				
		return calendar.equals(((CustomDate)obj).getDateRep());
	}

	public int hashCode()
	{
		return super.hashCode();
	}

	public boolean before(CustomDate other)
	{
		return calendar.before(other.getDateRep());
	}

	public boolean after(CustomDate other)
	{
		return calendar.after(other.getDateRep());
	}

	public String toString()
	{
		SimpleDateFormat sdf = new SimpleDateFormat("E, dd.MM.yyyy hh a", Locale.ENGLISH);
		return sdf.format(calendar.getTime());
	}

	public void addMinutes(int value)
	{
		calendar.add(GregorianCalendar.MINUTE, value);
	}

	public void addHours(int value)
	{

		calendar.add(GregorianCalendar.HOUR, value);
	}

	public void addDays(int value)
	{
		calendar.add(GregorianCalendar.DAY_OF_MONTH, value);
	}

	public int getYear()
	{
		return calendar.get(GregorianCalendar.YEAR);
	}

	public int getMonth()
	{
		return calendar.get(GregorianCalendar.MONTH)+1;
	}

	public int getDay()
	{
		return calendar.get(GregorianCalendar.DAY_OF_MONTH);
	}

	public int getHour()
	{
		return calendar.get(GregorianCalendar.HOUR);
	}

	public int getMinute()
	{
		return calendar.get(GregorianCalendar.MINUTE);
	}

	public GregorianCalendar getDateRep()
	{
		return calendar;
	}

	public int compareTo(CustomDate other)
	{
		return calendar.compareTo(other.getDateRep());
	}
}

Nur beim HashCode bin ich nicht sicher...
 
ok, habs getestet, viel viel besser, aber noch ne kleine fehlermeldung, vielleicht kannste mir sagen ob ich richtig lieg mit meiner vermutung!
Testcase: testConstructorsAndToString took 0.023 sec
FAILED
Date (Month) ist not initialized correctly. expected:<9> but was:<37>
junit.framework.AssertionFailedError: Date (Month) ist not initialized correctly. expected:<9> but was:<37>
at level_1.TestCustomDate.testConstructorsAndToString(TestCustomDate.java:39)

Testcase: testIsLeapYear took 0.006 sec
Testcase: testEqualsDayOnly took 0.006 sec
FAILED
Thu, 21.05.2009 11 PM should not be equal to Tue, 21.04.2009 11 PM
junit.framework.AssertionFailedError: Thu, 21.05.2009 11 PM should not be equal to Tue, 21.04.2009 11 PM
at level_1.TestCustomDate.testEqualsDayOnly(TestCustomDate.java:93)

Testcase: testEquals took 0.01 sec
Testcase: testBefore took 0.005 sec
Testcase: testAfter took 0.005 sec
Testcase: testToString took 0.013 sec
Caused an ERROR
toString is not formatting correctly. expected:<Wed[nesday, 09.09.2009 11:04] PM> but was:<Wed[, 09.09.2009 11] PM>
at level_1.TestCustomDate.testToString(TestCustomDate.java:201)

Testcase: testAdders took 0.006 sec
FAILED
addHours is not correct. expected:<4> but was:<16>
junit.framework.AssertionFailedError: addHours is not correct. expected:<4> but was:<16>
at level_1.TestCustomDate.testAdders(TestCustomDate.java:226)

Testcase: testGetters took 0.006 sec
FAILED
getHour is not correct. expected:<1> but was:<13>
junit.framework.AssertionFailedError: getHour is not correct. expected:<1> but was:<13>
at level_1.TestCustomDate.testGetters(TestCustomDate.java:261)

Testcase: testCompareTo took 0.007 sec

das mit den jahren und stunden liegt an dem gregorischen kalender oder? weil der bei 0 anfängt zu zählen?
und wie kann ich in der toString den kompletten tag ausgeben??
 

Ariol

Top Contributor
Java:
public String toString()
    {
        SimpleDateFormat sdf = new SimpleDateFormat("EEEEEEEEE, dd.MM.yyyy hh:mm a", Locale.ENGLISH);
        return sdf.format(calendar.getTime());
    }

Das mit den Stunden und Monaten versteh ich allerdings noch nicht so ganz. Versuchs doch bitte nochmal mit der geänderten toString()

Und poste bitte mal deine Testklasse. (in Tags - siehe oben 20:45)
 
die Test-klasse selbst hab ich leider nicht, die wurde zur verfügung gestellt!

momentan sieht der fehler so aus:
Testcase: testConstructorsAndToString took 0.02 sec
FAILED
Date (Month) ist not initialized correctly. expected:<9> but was:<8>
junit.framework.AssertionFailedError: Date (Month) ist not initialized correctly. expected:<9> but was:<8>
at level_1.TestCustomDate.testConstructorsAndToString(TestCustomDate.java:39)

Testcase: testIsLeapYear took -0.003 sec
Testcase: testEqualsDayOnly took 0.009 sec
FAILED
Thursday, 25.06.2009 04:30 AM should be equal to Thursday, 25.06.2009 11:30 PM
junit.framework.AssertionFailedError: Thursday, 25.06.2009 04:30 AM should be equal to Thursday, 25.06.2009 11:30 PM
at level_1.TestCustomDate.testEqualsDayOnly(TestCustomDate.java:103)

Testcase: testEquals took 0.002 sec
Testcase: testBefore took 0.01 sec
Testcase: testAfter took 0.008 sec
Testcase: testToString took 0.005 sec
Testcase: testAdders took 0.006 sec
FAILED
addMinutes is not correct. expected:<22> but was:<2>
junit.framework.AssertionFailedError: addMinutes is not correct. expected:<22> but was:<2>
at level_1.TestCustomDate.testAdders(TestCustomDate.java:221)

Testcase: testGetters took 0.001 sec
FAILED
getDay is not correct. expected:<5> but was:<1>
junit.framework.AssertionFailedError: getDay is not correct. expected:<5> but was:<1>
at level_1.TestCustomDate.testGetters(TestCustomDate.java:262)

Testcase: testCompareTo took 0.007 sec
FAILED
Sunday, 05.07.2009 01:10 PM schould be as big as Sunday, 05.07.2009 01:10 PM
junit.framework.AssertionFailedError: Sunday, 05.07.2009 01:10 PM schould be as big as Sunday, 05.07.2009 01:10 PM
at level_1.TestCustomDate.testCompareTo(TestCustomDate.java:274)
 
das mit den monaten hat sich schon erlegdigt, hab ne zeile geändert!
naja, den rest bekomm ich schon hin, aber vielen herzlichen dank für die hilfe:)
 

Ariol

Top Contributor
Versuch's mal mit HOUR_OF_DAY anstelle von HOUR:

Java:
package jpp.tourManager.date;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CustomDate implements java.lang.Comparable<CustomDate>
{
	private GregorianCalendar	calendar;

	public CustomDate()
	{
		calendar = new GregorianCalendar();
	}

	public CustomDate(Date other)
	{
		calendar = new GregorianCalendar();
		calendar.setTime(other);
	}

	public CustomDate(int year, int month, int day, int hour, int minute)
	{
		calendar = new GregorianCalendar(year, month-1, day, hour, minute);
	}

	public boolean isLeapYear(int year)
	{
		if (year == 0)
			return false;
		return calendar.isLeapYear(year);
	}

	public boolean equalsDayOnly(CustomDate other)
	{
		boolean yearEqual = getYear()==other.getYear();
		boolean monthEqual = getHour()==other.getHour();
		boolean dayEqual = getDay()==other.getDay();
		return yearEqual && monthEqual && dayEqual;		
	}

	public boolean equals(Object obj)
	{
		if (obj == null || !(obj instanceof CustomDate))
			return false;
				
		return calendar.equals(((CustomDate)obj).getDateRep());
	}

	public int hashCode()
	{
		return super.hashCode();
	}

	public boolean before(CustomDate other)
	{
		return calendar.before(other.getDateRep());
	}

	public boolean after(CustomDate other)
	{
		return calendar.after(other.getDateRep());
	}

	public String toString()
    {
        SimpleDateFormat sdf = new SimpleDateFormat("EEEEEEEEE, dd.MM.yyyy hh:mm a", Locale.ENGLISH);
        return sdf.format(calendar.getTime());
    }

	public void addMinutes(int value)
	{
		calendar.add(GregorianCalendar.MINUTE, value);
	}

	public void addHours(int value)
	{

		calendar.add(GregorianCalendar.HOUR_OF_DAY, value);
	}

	public void addDays(int value)
	{
		calendar.add(GregorianCalendar.DAY_OF_MONTH, value);
	}

	public int getYear()
	{
		return calendar.get(GregorianCalendar.YEAR);
	}

	public int getMonth()
	{
		return calendar.get(GregorianCalendar.MONTH)+1;
	}

	public int getDay()
	{
		return calendar.get(GregorianCalendar.DAY_OF_MONTH);
	}

	public int getHour()
	{
		return calendar.get(GregorianCalendar.HOUR_OF_DAY);
	}

	public int getMinute()
	{
		return calendar.get(GregorianCalendar.MINUTE);
	}

	public GregorianCalendar getDateRep()
	{
		return calendar;
	}

	public int compareTo(CustomDate other)
	{
		return calendar.compareTo(other.getDateRep());
	}
}

Habs mal auf die schnelle hiermit getestet:
Java:
package jpp.tourManager.date;

import java.util.Date;

public class CustomDateTest
{

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException
	{
		Date now = new Date();
		Thread.sleep(60000);
		Date then = new Date();
		
		CustomDate ncd = new CustomDate(now);
		CustomDate tcd = new CustomDate(then);
		
		System.out.println(ncd);
		System.out.println(ncd.equals(ncd));		
		System.out.println(ncd.equalsDayOnly(ncd));		
		System.out.println(ncd.compareTo(ncd));
		System.out.println();
		
		System.out.println(tcd);		
		System.out.println(ncd.equals(tcd));		
		System.out.println(ncd.equalsDayOnly(tcd));		
		System.out.println(ncd.compareTo(tcd));
		System.out.println();
		
		int y = 2009;
		int m = 9;
		int d = 12;
		int hh = 13;
		int mm = 35;
		
		CustomDate test = new CustomDate(y,m,d,hh,mm);
		System.out.println(test);
		System.out.println(test.getYear()   + "==" + y  + ":" + (test.getYear()   == y));
		System.out.println(test.getMonth()  + "==" + m  + ":" + (test.getMonth()  == m));
		System.out.println(test.getDay()    + "==" + d  + ":" + (test.getDay()    == d));
		System.out.println(test.getHour()   + "==" + hh + ":" + (test.getHour()   == hh));
		System.out.println(test.getMinute() + "==" + mm + ":" + (test.getMinute() == mm));
		System.out.println();
		
		d+=5;
		hh+=5;
		mm+=5;
		
		test.addDays(5);
		test.addHours(5);
		test.addMinutes(5);
		System.out.println(test);
		System.out.println(test.getYear()   + "==" + y  + ":" + (test.getYear()   == y));
		System.out.println(test.getMonth()  + "==" + m  + ":" + (test.getMonth()  == m));
		System.out.println(test.getDay()    + "==" + d  + ":" + (test.getDay()    == d));
		System.out.println(test.getHour()   + "==" + hh + ":" + (test.getHour()   == hh));
		System.out.println(test.getMinute() + "==" + mm + ":" + (test.getMinute() == mm));
		System.out.println();
		
	}

}
 
ok 3 fehler sind übrig:
1:
Date (Day) ist not initialized correctly. expected:<10> but was:<2>
junit.framework.AssertionFailedError: Date (Day) ist not initialized correctly. expected:<10> but was:<2>
at level_1.TestCustomDate.testConstructorsAndToString(TestCustomDate.java:41)
2:
addMinutes is not correct. expected:<22> but was:<4>
junit.framework.AssertionFailedError: addMinutes is not correct. expected:<22> but was:<4>
at level_1.TestCustomDate.testAdders(TestCustomDate.java:221)
3:
getDay is not correct. expected:<5> but was:<1>
junit.framework.AssertionFailedError: getDay is not correct. expected:<5> but was:<1>
at level_1.TestCustomDate.testGetters(TestCustomDate.java:262)
 

Ariol

Top Contributor
nö, wird net besser

bei mir geht das schon ziemlich gut...

ok 3 fehler sind übrig:
1:
Date (Day) ist not initialized correctly. expected:<10> but was:<2>
junit.framework.AssertionFailedError: Date (Day) ist not initialized correctly. expected:<10> but was:<2>
at level_1.TestCustomDate.testConstructorsAndToString(TestCustomDate.java:41)
2:
addMinutes is not correct. expected:<22> but was:<4>
junit.framework.AssertionFailedError: addMinutes is not correct. expected:<22> but was:<4>
at level_1.TestCustomDate.testAdders(TestCustomDate.java:221)
3:
getDay is not correct. expected:<5> but was:<1>
junit.framework.AssertionFailedError: getDay is not correct. expected:<5> but was:<1>
at level_1.TestCustomDate.testGetters(TestCustomDate.java:262)

Seltsam, das hier sind die Ausgaben meiner Testklasse:
Code:
//Vergleich mit sich selbst
Thursday, 10.09.2009 12:10 AM
true
true
0

//Vergleich mit 1 Minute später
Thursday, 10.09.2009 12:11 AM
false
true
-1

//Setter und Getter
Saturday, 12.09.2009 01:35 PM
2009==2009:true
9==9:true
12==12:true
13==13:true
35==35:true

//Add und Getter
Thursday, 17.09.2009 06:40 PM
2009==2009:true
9==9:true
17==17:true
18==18:true
40==40:true

Was man noch einbauen könnte wäre, dass er von einem übergebenen Date-Object Sekunden und Millisekunden nicht übernimmt (ist mir nur grad so eingefallen)

Red mal mit deinem Prof - vielleicht weiß der Rat.

So, ich geh jetzt schlafen. GN8
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben