Datum vergleichen

sohpos

Grünschnabel
Hallo,
Vielleicht könnt ihr mir ja auf die Sprünge helfen

Aufgabe:
Realisieren Sie die Klasse Datum. Dabei soll der Klasse das Datum sowohl im Format DD.MM.JJJJJ als auch im Format MM/DD/JJJJ als String übergeben werden können. Das Datum 01.11.1987 und das Datum 11/01/1987 repräsentieren beide den 01. November 1987. Achten Sie bei der Implementierung darauf, dass – wenn Objekte dieser Klasse in einem HashSet verwendet werden – keine doppelten Objekte in dem HashSet orkommen.

public class Datum {
Platz für die eigene Implementierung
}

Hier ist meine Lösung dazu, aber bin mir nicht 100% sicher:rolleyes:
Code:
import java.lang.Integer.*;
import java.util.StringTokenizer;

/**
 *
 * @author
 */
public class Datum {
    int tag;
    int monat;
    int jahr;
    private String date;
        
    Datum (int tag,int monat,int jahr)
    {
        this.tag=tag;
        this.monat=monat;
        this.jahr=jahr;
    }
      
    public Datum (String date)
    {
        this.date = date;    
               
    }
       
    public void setDatum()
    {
       String trenzeichen= this.date.substring(2,3);
      
       if (trenzeichen.equals("."))
      {
           StringTokenizer dt = new StringTokenizer(date,".");
           tag = Integer.parseInt(dt.nextToken());
           monat = Integer.parseInt (dt.nextToken());
           jahr= Integer.parseInt(dt.nextToken()); }
      else if (trenzeichen.equals("/"))
      {
          StringTokenizer st = new StringTokenizer(date,"/");
           monat = Integer.parseInt(st.nextToken());
           tag = Integer.parseInt (st.nextToken());
           jahr=Integer.parseInt(st.nextToken());
        
      }
      
    }
  
    @Override
      public boolean equals (Object obj)
      {
        boolean istGleich=false;
                
        if (obj instanceof Datum) {
            Datum d =(Datum)obj;
            if (this.hashCode()==d.hashCode())
            {
                istGleich = tag==d.tag&&
                            monat==d.monat&&
                            jahr==d.jahr;
                
            }
        }
        return istGleich;
      
      }
    
    @Override
    public int hashCode() {
        return this.tag+this.monat+this.jahr;
       
    }
     
    
   public static void main(String[] args)

   {
        Datum dt = new Datum("02.05.2008");
        dt.setDatum();
        Datum st = new Datum ("05/02/2008");
        st.setDatum();
        boolean temp = dt.equals(st);
        System.out.println(temp);
        
   }
   

}
 
Scheint doch zu gehen oder?

Aber es ist doch sehr umständlich dass man manuell setDatum aufrufen muss obwohl man sich doch gerade ein neues Datum erstellt hat. Fällt dir da nicht noch was ein, wie das einfacher gehen könnte (für den Anwender deiner Klasse)?

StringTokenizer sollte übrigens nicht mehr verwendet werden. Stattdessen kannst du String.split verwendenen:
String.split("\\.") bzw. String.split("/")

In setDatum fehlt dir noch eine Behandlung falls jemand versehenlich ein falsches Trennzeichen angegeben hat.
 
[bullshit comment="Lesen Ollie!"]
Warum schreibt man sowas selber?

http://joda-time.sourceforge.net/
[/bullshit]

Ich würde versuchen zu vermeiden, den doppelten Zustand zu halten (einmal String, einmal die Felder). Die HashCodeImplementierung ist auch nicht sehr stark (liefer für 15.11.2008 und 16.12.2008 die gleichen werte - kein Beinbruch, aber ungünstig).

Ansonsten vielleicht noch ein zwei Codestylegeschichten. Wenn du in der Equals Methode das if-instance-of umdrehst, musst du die ifs nicht schachteln:

Java:
if (!(obj instanceof Datum)) {
  return false;
}

// weiter gehts

Den vergleich auf die Hashcodes kannst du dir auch sparen, da der implizit schon vorher passiert.

REINHAUN!
 
Scheint doch zu gehen oder?

Aber es ist doch sehr umständlich dass man manuell setDatum aufrufen muss obwohl man sich doch gerade ein neues Datum erstellt hat. Fällt dir da nicht noch was ein, wie das einfacher gehen könnte (für den Anwender deiner Klasse)?

StringTokenizer sollte übrigens nicht mehr verwendet werden. Stattdessen kannst du String.split verwendenen:
String.split("\\.") bzw. String.split("/")

In setDatum fehlt dir noch eine Behandlung falls jemand versehenlich ein falsches Trennzeichen angegeben hat.

ja wie kann ich noch einfacher machen?
 
[bullshit comment="Lesen Ollie!"]
Warum schreibt man sowas selber?

http://joda-time.sourceforge.net/
[/bullshit]

Ich würde versuchen zu vermeiden, den doppelten Zustand zu halten (einmal String, einmal die Felder). Die HashCodeImplementierung ist auch nicht sehr stark (liefer für 15.11.2008 und 16.12.2008 die gleichen werte - kein Beinbruch, aber ungünstig).

Ansonsten vielleicht noch ein zwei Codestylegeschichten. Wenn du in der Equals Methode das if-instance-of umdrehst, musst du die ifs nicht schachteln:

Java:
if (!(obj instanceof Datum)) {
  return false;
}

// weiter gehts

Den vergleich auf die Hashcodes kannst du dir auch sparen, da der implizit schon vorher passiert.

REINHAUN!

Danke

so habe ich mein equals Code geändert

Code:
@Override
      public boolean equals (Object obj)
    {
        boolean istGleich=false;
                
        if (!(obj instanceof Datum)) {
            return false;
        }
         istGleich = ((Datum)obj).tag==tag&&
                    ((Datum)obj).monat==monat&&
                    ((Datum)obj).jahr==jahr;
         return istGleich;
    }
für hashCode bekomme 15.11.2008 und 16.12.2008 die gleichen werte false geliefert
 
Zurück