Uhrzeit-Aufgabe

M

Möpppel

Gast
Moin,
ich muss eine Aufgabe bearbeiten in der ich das erste mal mit Klassen, Methoden, Konstruktoren richtig arbeiten muss.
Leider weiß ich nicht wie ich am besten an diese Aufgabe rangehen weil ich mir noch garnicht so sicher bin was ich da machen muss und wie das alles funktioniert. Könntet ihr mir vllt. ein par kleine TIpps geben damit ich den Einstieg besser finde?

hier ist die Aufgabe:
Java:
Eine Uhrzeit wird die durch die Angabe einer Stunde (0–23), einer
Minute (0–59) und einer Sekunde (0–59) festgelegt. Beispiel: 14:59:01 Uhr.
Schreiben Sie eine Klasse Uhrzeit, die eine Zeitangabe durch die drei privaten Attribute
stunden, minuten und sekunden vom Datentyp int repräsentiert. Neben diesen
Attributen soll Ihre Klasse mindestens die folgenden Methoden enthalten:

a) Konstruktoren: Der parameterlose Konstruktor Uhrzeit() initialisiert die Zeit mit
00:00:00 Uhr. Der Konstruktor
Uhrzeit(int stunden, int minuten, int sekunden)
setzt die Zeit auf die Parameterwerte.

b) Get- und Set-Methoden: Die folgenden Methoden sollen die jeweiligen Attribute als
Ergebnis liefern bzw. die entsprechenden Attribute setzen:
getStunden()
getMinuten()
getSekunden()
setUhrzeit(int stunden, int minuten, int sekunden)

c) Überlagerung von Methoden der Klasse Object:
– Die Methode toString() soll die aktuelle Uhrzeit in der Form 14:59:01 Uhr
liefern.
– Die Methode equals(Object o) soll den Parameter mit dem aktuellen Objekt
vergleichen.
– Die Methode clone() soll ein neues Objekt der Klasse Uhrzeit mit der Zeit
des aktuellen Objekts liefern.

d) Die Methoden add(Uhrzeit u), sub(Uhrzeit u) und früher(Uhrzeit u) sollen
die durch den Parameter übergebene Uhrzeit zur aktuellen Uhrzeit addieren, von
der aktuellen Uhrzeit subtrahieren bzw. mit der aktuellen Uhrzeit vergleichen.

Stellen Sie sicher, dass die Stundenwerte stets im Bereich 0–23 und die Minuten- und
Sekundenwerte im Bereich 0–59 liegen. Sie dürfen bei der Implementierung der Methoden
Hilfsattribute und -methoden verwenden.

Vielen Dank schonmal :)
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
damit hat er dir schonmal mindestens zwei wörter und zwei geschweifte klammern gesagt ;D. falls es dir vllt noch weiterhilft, repräsentiert die aufgabenstellung auch das grundgerüst der klasse. mach es wie maki schon schön angedeutet hat einfach schritt für schritt durch. bis c) sollte das drin sein. falls du iwo nicht weiter kommst, helfen wir dir anhand von ansätzen gern weiter.
 

Heady86

Bekanntes Mitglied
Eigentlich steht ja schon alles schön beschrieben drin was du machen musst. Dadurch lässt sichs auch leicht googlen wenn du was nich weißt.

Ich mach mal nen Anfang:

drei privaten Attribute
stunden, minuten und sekunden vom Datentyp int repräsentiert.

Java:
private int stunden;
....


Der Konstruktor Uhrzeit(int stunden, int minuten, int sekunden)..

Java:
public Uhrzeit (int stunden, int minuten, int sekunden) {
  this.stunden = stunden;
  this.minuten = minuten;
  this.sekunden = sekunden;
}


Java:
public int getStunden() {
  return stunden;
}

usw.
 
M

Möppppel

Gast
So ich bin jetzt ein bissel vorrangekommen:

Java:
public class Uhrzeit {
    
// Attribute 
  
  private int stunden;
  
  private int minuten;
    
  private int sekunden;

// Konstruktoren  
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int newstunden, int newminuten, int newsekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }

// get- und set-Methoden 

  public int getStunden() {
    return stunden;
  }

  public int getMinuten() {
    return minuten;
  }

  public int getSekunden() {
    return stunden;
  }

  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    stunde = h;
    minuten = m;
    sekunden = s; 
  }

}

Ist das soweit richtig (bis c) ??
 

Heady86

Bekanntes Mitglied
Ich geh davon aus du hast den Code nicht compiliert, ansonsten hättest du einige Fehler.
Diese hätten sich aber zum Gr0ßteil leicht durch Compilerfehlermeldungen finden lassen:

FEHLER 1
Java:
 public Uhrzeit(int newstunden, int newminuten, int newsekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
Das stimmt so nicht. Mit
Java:
this
musst du nur arbeiten wenn eine Übergabeparameter gleich heißen wie deine variabelen im Code. Außerdem nutzt du hier deine Übergabeparameter gar nicht.

So würde es gehen:
Java:
 public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }

FEHLER 2


Java:
public void setUhrzeit(int stunden, int minuten, int sekunden) {
    stunde = h;
    minuten = m;
    sekunden = s; 
  }

Es gibt die Variable "stunde" nicht, wenn dann "stunden".
Außerdem der gleiche Fehler wie bei setUhrzeit(). Die übergebenen Namen sind nicht identisch mit denen die du in deiner Methode setzt.

FEHLER 3
Java:
public int getSekunden() {
    return stunden;
  }

Hier dürfte der Fehler offensichtlich sein...
 
M

Möpppel

Gast
So hab jetzt mal die Fehler verbessert!

Java:
public class Uhrzeit {
    
// Attribute 
  
  private int stunden;
  
  private int minuten;
    
  private int sekunden;

// Konstruktoren  
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
// get- und set-Methoden 

  public int getStunden() {
    return stunden;
  }

  public int getMinuten() {
    return minuten;
  }

  public int getSekunden() {
    return sekunden;
  }

  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    this.stunden = stunden;
    this.minuten = minuten;
    this.sekunden = sekunden;
  }

}

Is das jetzt soweit richtig das ich mit aufgabenteil C) weitermachen kann?
 

heoyeah

Mitglied
Ich muss die Aufgabe auch machen.
Bei mir funktioniert bis jetzt nur die Methode fürs Addieren.
Java:
public class Uhrzeit {

   // Attribute

   private int stunden;
   private int minuten;
   private int sekunden;
   public int Uhrzeit;

   // Konstruktoren
   
   public Uhrzeit() {

     stunden = minuten = sekunden = 0;

   }
   
   public Uhrzeit(int stunden, int minuten, int sekunden) {

     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;

   }
   
   // get-Methoden

   public int getStunden() {

     return stunden;

   }

   public int getMinuten() {

     return minuten;

   }

   public int getSekunden() {

     return sekunden;

   }

   // set-Methode

   public int setUhrzeit(int stunden, int minuten, int sekunden) {

     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
     return Uhrzeit;
   }

   public String toString() {
     
      String Uhrzeit = getStunden() + ":";
      if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
      if (getMinuten()<10) Uhrzeit += "0";
      Uhrzeit += getMinuten() + ":";
      if (getSekunden()<10) Uhrzeit += "0";
      Uhrzeit += getSekunden();
      return Uhrzeit;
   }

   public void add(Uhrzeit u) {
     
      sekunden += u.sekunden;
      int neue_minuten = sekunden/60;
      sekunden = sekunden % 60;
      minuten += u.minuten;
      minuten += neue_minuten;
      int neue_stunden = minuten/60;
      minuten = minuten % 60;
      stunden += u.stunden;
      stunden += neue_stunden;
      stunden = stunden % 24
   }

}
 

nrg

Top Contributor
Deine toString() Methode sieht doch auch echt gut aus! Funktioniert auch soweit.

Hier vllt noch eine Option für die toString() Methode:

Java:
import java.text.DecimalFormat;

public class Uhrzeit{
   ....
   public String toString() {
	  DecimalFormat myDF = new DecimalFormat("00");
	  return 	myDF.format(getStunden()) + ":" + 
	  			myDF.format(getMinuten()) + ":" + 
	  			myDF.format(getSekunden());
   }
}
[/Java]

die anderen methoden lass ich mal noch offen... deine add() funzt ja. ist allerdings nicht grad schön zu lesen.
edit: dann sollte die sub() Methode ja auch kein problem für dich sein.
Für die clone() musst du einfach ein neues Objekt anhand des aktuellen Objektes instanziieren.
Die Methode früher() ruft die Methode equals() auf.
In der equals() Methode musst du das Objekt mit dem übergegeben Objekt auf inhaltliche (nicht nur referenzielle!!) gleichheit überprüfen (paar ifs und die sache ist erledigt).

grüße
nrg
 
Zuletzt bearbeitet:

Heady86

Bekanntes Mitglied
Zusätzlich noch:

heoyeah hat gesagt.:
Java:
stunden = stunden % 24
hier fehlt noch ein
Java:
;
ist aber warscheinlich nur eine copy/paste fehler

heoyeah hat gesagt.:
Java:
public int setUhrzeit(int stunden, int minuten, int sekunden) {
 
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
     return Uhrzeit;
}

Schau dir nochmal den Aufbau von Get/Set Methoden an, hier hast du beides miteinander vermischt.
 
Zuletzt bearbeitet:

Leuchtturm

Mitglied
nabend,
Ich muss die aufgabe leider auch machen ;)

Aber leider bekomm ich das mit den subtrahieren überhaupt nicht hin :rtfm:.
und wo der unterschied in der methode equals und früher liegt.
Kann mit vllt. jemand einen kleinen tipp geben?

danke :)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Der Unterschied zwischen equals und früher ist: equals vergleicht eine Uhrzeit mit irgendeinem Objekt, und gibt zurück, ob das andere Objekt auch eine Uhrzeit ist, die die gleiche Zeit beschreibt.
"früher" überprüft, ob eine Uhrzeit einen früheren Zeitpunkt beschreibt, als eine andere Uhrzeit.

Zum sub: Poste mal, was du bisher hast, und beschreibe die Probleme.
 

Leuchtturm

Mitglied
Bei sub hab ich halt noch keine wirkliche idee wie sich das einfach mathematisch umsetzen lässt ( vllt stunen * 3600 und minuten * 60 und dann wieder teilen? )

Die Methode equals hab ich jetzt so gestaltet:
Java:
   public boolean equals(Uhrzeit u) {
   int b = sekunden;
   int a = u.sekunden;
   int x = minuten;
   int y = u.minuten;
   int i = stunden;
   int j = u.stunden;
   if (b == a || x == y || i ==j)
     return true;
    else
        return false;
 }

is das so richtig oder macht man das mit object.equals(X) ?
 

faetzminator

Gesperrter Benutzer
Ich würde es so machen (bezogen auf eine Klasse Foo mit den int's a und b):
Java:
@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof Foo)) {
        return false;
    }
    Foo foo = (Foo) o;
    return this.a == foo.a && this.b == foo.b;
}
Der Unterschied ist, dass du laut Methodensignatur von Object nur ein Object übergeben bekommst. Zusätzlich musst du [c]o[/c] auf [c]null[/c] überprüfen (in meinem Fall macht das instanceof).
Edit: zusätzlich musst du deine Felder natürlich nicht mit einem OR, sondern mit einem AND überprüfen.
 

faetzminator

Gesperrter Benutzer
Was verstehst du nicht? Wenn das andere Objekt das genau gleiche wie das aktuelle ist (3) wird true (4) zurückgegeben. Ansonsten wird überprüft ob o vom Typen Foo ist (6), wenn nicht wird false (7) zurückgeben. Ansonsten wird das Objekt nach Foo gecastet (9) und deren a und b wird mit der aktuellen Instanz (this) verglichen (10). Das ganze muss natürlich AND und nicht OR verknüpft sein, da du nur true willst, falls alle (und nicht nur einer) Felder (a und b) gleich sind.
 

Leuchtturm

Mitglied
komm damit nicht zurecht, werd erstmal ne pause machen und dann nochmal scahun ob ich was finde was mit weiterhilft, sonst verzweifelst du noch an meiner inkompetens ;)
 

heoyeah

Mitglied
Also bei mir sieht equals methode so aus:

Java:
  public boolean equals(Object o) {
    	  
     Uhrzeit u = (Uhrzeit)o;
     if (this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
     this.sekunden == u.getSekunden()) {
       return true;
     }
     return false;
 }
Ist das richtig so?
 

Marco13

Top Contributor
So fast. Bis man mal aufruft
uhrzeit.equals(einStringOderSo);
Dann kracht's mit einer CLassCastException. Schau dir mal an, was "instanceof" macht.
 

faetzminator

Gesperrter Benutzer
1. das von Marco13 genannte instanceof
2. da hätten wir wieder die NullPointerException, welche sich aber durch instanceof lösen liesse
3. der Referenzvergleich in meinem Beispiel kann den Check schneller lassen werden, falls des öfteren gleiche Objekte miteinander verglichen werden
 

Marco13

Top Contributor
Ach ja...

Java:
...
    if (!(o instanceof Foo)) {
        return false;
    }
}
...
Zusätzlich musst du [c]o[/c] auf [c]null[/c] überprüfen (in meinem Fall macht das instanceof).

Ich glaub' mein Kaffee wirkt noch nicht, aber ... im Moment glaube ich, dass das so nicht funktioniert!? Ist
null instanceof Foo
nicht IMMER true? D.h. wenn dort "null" übergeben wird, wird doch weitergegangen, und dann unten versucht, auf das (auf Foo gecastete) null zuzugreifen? ???:L
(Würde mich aber wundern, weil du das zweimal so "selbstsicher" geschrieben hast!? ;) ... Mal testen..)


EDIT: Ahja ... da hatte ich wohl in meinem Hinterkopf irgendwas mit castbarkeit, Zuweisbarkeit und isAssignableFrom oder so durcheinandergewürfelt ... Hier steht's genau: Expressions:
the result of the instanceof operator is true if the value of the RelationalExpression is not null and...
 
Zuletzt bearbeitet:

heoyeah

Mitglied
Danke für die Hilfe.
So ist jetzt richtig oder?
Java:
public boolean equals(Object o) {

        if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
 
 }
 

faetzminator

Gesperrter Benutzer
Ich glaub' mein Kaffee wirkt noch nicht, aber ... im Moment glaube ich, dass das so nicht funktioniert!? Ist null instanceof Foo nicht IMMER true? D.h. wenn dort "null" übergeben wird, wird doch weitergegangen, und dann unten versucht, auf das (auf Foo gecastete) null zuzugreifen? ???:L

falsch, [c]null[/c] gibt immer [c]false[/c] zurück ;)
 

Faton

Mitglied
private boolean prüfe;


public boolean equals(Uhrzeit u){
float kleinerA,kleinerB;
kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
kleinerB= u.stunden*60+u.minuten+u.sekunden/60;

if(kleinerA==kleinerB){
return !prüfe;
}
else {
return prüfe;

}


public boolean früher(Uhrzeit u){
float kleinerA,kleinerB;
kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
if(kleinerA<kleinerB){
return !prüfe;
}
else {
return prüfe;

}


public void add(Uhrzeit u){
this.sekunden+= u.sekunden;
this.minuten+= u.minuten;
this.stunden+= u.stunden;

if(this.sekunden>59){
this.sekunden-=60;
this.minuten+=1;
}

if(this.minuten>59){
this.minuten-=60;
this.stunden+=1;
}

if(this.stunden>23){
this.stunden-=24;

}


this.setUhrzeit(this.stunden,this.minuten,this.sekunden);


}

public void sub(Uhrzeit u){
this.sekunden-= u.sekunden;
this.minuten-= u.minuten;
this.stunden-= u.stunden;

if(this.sekunden<0){
this.sekunden+=60;
this.minuten-=1;
}

if(this.minuten<0){
this.minuten+=60;
this.stunden-=1;
}

if(this.stunden<0){
this.stunden+=24;

}


aber ich habe kein plan wie ich clone und equals machen soll:(...
könnt ihr mir helfen?

danke

ich brauche eine exploizite beschreibung dafür
 

Faton

Mitglied
public class Uhrzeit{

private int stunden,minuten,sekunden;
private boolean prüfe;
int uhrzeit;
public Uhrzeit(){
}


public Uhrzeit(int stunden,int minuten,int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59");

}

else if(sekunden>59 || sekunden<1){

}

else {
this.stunden= stunden;
this.minuten= minuten;
this.sekunden= sekunden;
}



}

public void setUhrzeit(int stunden,int minuten, int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23!");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59!");

}

else if(sekunden>59 || sekunden<1){
//System.out.println("Fehler!:Gültige Sekunden nur von 0-59!");

}

else {
this.stunden= stunden;
this.minuten= minuten;
this.sekunden= sekunden;

}


}






public int getUhrzeit(){
return this.uhrzeit;
}

public int getStunden(){
return this.stunden;
}

public int getMinuten(){
return this.minuten;
}

public int getSekunden(){
return this.sekunden;
}

public void add(Uhrzeit u){
this.sekunden+= u.sekunden;
this.minuten+= u.minuten;
this.stunden+= u.stunden;

if(this.sekunden>59){
this.sekunden-=60;
this.minuten+=1;
}

if(this.minuten>59){
this.minuten-=60;
this.stunden+=1;
}

if(this.stunden>23){
this.stunden-=24;

}


this.setUhrzeit(this.stunden,this.minuten,this.sekunden);


}

public void sub(Uhrzeit u){
this.sekunden-= u.sekunden;
this.minuten-= u.minuten;
this.stunden-= u.stunden;

if(this.sekunden<0){
this.sekunden+=60;
this.minuten-=1;
}

if(this.minuten<0){
this.minuten+=60;
this.stunden-=1;
}

if(this.stunden<0){
this.stunden+=24;

}


this.setUhrzeit(this.stunden,this.minuten,this.sekunden);

}

public boolean früher(Uhrzeit u){
float kleinerA,kleinerB;
kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
if(kleinerA<kleinerB){
return !prüfe;
}
else {
return prüfe;

}


}

public boolean equals(Uhrzeit u){
float kleinerA,kleinerB;
kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
kleinerB= u.stunden*60+u.minuten+u.sekunden/60;

if(kleinerA==kleinerB){
return !prüfe;
}
else {
return prüfe;

}



}






public Uhrzeit clone(){
return new Uhrzeit(this.stunden,this.minuten,this.sekunden);

}

public String toString() {

String Uhrzeit = getStunden() + ":";
if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
if (getMinuten()<10) Uhrzeit += "0";
Uhrzeit += getMinuten() + ":";
if (getSekunden()<10) Uhrzeit += "0";
Uhrzeit += getSekunden();
return Uhrzeit;
}









}

es klappt mit dem clone einfach nicht!!!!!


The return type is incompatible with Object.clone()

das steht als fehlermeldung ???:L!!!1 Bitte gebt mir explizit das Beispiel für clone() und equals(Object o)

vielen danke:)
 

eRaaaa

Top Contributor
man müsste sich nur mal die Links anschauen, die einem vorgeschlagen werden ;D
(und den Code in
Java:
 - Tags zu schreiben wäre auch gut! 

[code=Java]
public class Uhrzeit implements Cloneable{

//.....

    @Override
    public Uhrzeit clone() {
	try {
	    return (Uhrzeit) super.clone();
	} catch (CloneNotSupportedException e) {
	    throw new InternalError();
	}
    }
 
U

uhrzeit fertig

Gast
So damit sollte nun diese Aufgabe gelöst sein:

Java:
public class Uhrzeit implements Cloneable {
    
// Aufgabenteil a)
  
  private int stunden;
  private int minuten;  
  private int sekunden;
  

 
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
// Aufgabenteil b)

  public int getStunden() {
    return stunden;
  }
  public int getMinuten() {
    return minuten;
  }
  public int getSekunden() {
    return sekunden;
  }
  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    this.stunden = stunden;
    this.minuten = minuten;
    this.sekunden = sekunden;
  }
// Aufgabenteil c)

  public String toString() {
    String Uhrzeit = getStunden() + ":";
    if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
    if (getMinuten()<10) Uhrzeit += "0";
    Uhrzeit += getMinuten() + ":";
    if (getSekunden()<10) Uhrzeit += "0";
    Uhrzeit += getSekunden() + " Uhr";
    return Uhrzeit;
  }

  public boolean equals(Object o) {
      if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
  }    
  
  public Uhrzeit clone() {
    try {
        return (Uhrzeit) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new InternalError();
    }
    }
// Aufgabenteil d)

  public void add(Uhrzeit u) {   
   this.sekunden+= u.sekunden;
   this.minuten+= u.minuten;
   this.stunden+= u.stunden;

  if(this.sekunden>59){
   this.sekunden-=60;
   this.minuten+=1;
 }

  if(this.minuten>59){
   this.minuten-=60;
   this.stunden+=1;
 }

  if(this.stunden>23){
   this.stunden-=24;
  } 
  }
 
 public void sub(Uhrzeit u) {
      this.sekunden-= u.sekunden;
      this.minuten-= u.minuten;
      this.stunden-= u.stunden;

       if(this.sekunden<0){
        this.sekunden+=60;
        this.minuten-=1;
       }

       if(this.minuten<0){
        this.minuten+=60;
        this.stunden-=1;
       }

      if(this.stunden<0){
        this.stunden+=24;                                
      }
  }
 public boolean früher(Uhrzeit u) {
  float kleinerA,kleinerB;
  kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
  kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
  if(kleinerA<kleinerB){
    return true;
  }
  else {
   return false;
  }  
 }
}

oder gibts noch verbesserungsvorschläge?
sonst danke an alle die hier mitgeholfen haben und tips und gute Ratschläge gegeben haben!

Frohe Weihnachten!
 

eRaaaa

Top Contributor
Eine Sache hätte ich da schon
Code:
Stellen Sie sicher, dass die Stundenwerte stets im Bereich 0–23 und die Minuten- und
Sekundenwerte im Bereich 0–59 liegen. Sie dürfen bei der Implementierung der Methoden
Hilfsattribute und -methoden verwenden.

Das solltest du beim Konstruktor + setter Methoden beachten!
Ich könnte jetzt auch eine Uhrzeit angeben, die nicht in diesem Bereich liegt
 
U

Uhrzeit fertig

Gast
ja richtig wie es Faton schon gepostet hat:

Java:
public Uhrzeit(int stunden,int minuten,int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59");

}

else if(sekunden>59 || sekunden<1){

}

else {
this.stunden= stunden;
this.minuten= minuten;
this.sekunden= sekunden;
}



}

public void setUhrzeit(int stunden,int minuten, int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23!");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59!");

}

else if(sekunden>59 || sekunden<1){
//System.out.println("Fehler!:Gültige Sekunden nur von 0-59!");

}
 

eRaaaa

Top Contributor
Ich will ja nicht pingelig sein, aber wieso dürfen Minuten und Sekunden bei dir nicht 0 sein? :)

Ich würde mir dafür auch lieber eine Methode schreiben, das erspart dir die Redundanz!

Java:
    private boolean isCorrectTime(int stunden, int minuten, int sekunden) {
	return stunden < 24 && stunden >= 0 && minuten < 60 && minuten >= 0
		&& sekunden < 60 && sekunden >= 0;
    }

Konstruktor dann irgendwie so:
Java:
    public Uhrzeit(int stunden, int minuten, int sekunden) {
	if (isCorrectTime(stunden, minuten, sekunden)) {
	    this.stunden = stunden;
	    this.minuten = minuten;
	    this.sekunden = sekunden;
	} else {
	    throw new IllegalArgumentException("Keine gültige Uhrzeit!");
	}
    }
 

Faton

Mitglied
The return type is incompatible with Object.clone()
Steht als Fehlermeldung???
kp warum das so ist...
achja habe einen Fehler noch gefunden....

Zeile 7 und 12... Minuten<0 und sekunden <0 nicht kleiner als eins^^...

Also das mit copy funktioniert nicht...
kann das eine bei euch ausprobieren vllt liegt das an meinem Rechner oder an Java :S...

Vielen dank Leute:)

Achja schöne Weihnachten:)
 
M

MoD

Gast
Hallo,

könnt ihr mich nochmal die equals-Methode dieser Forum für Dummies erklären?

Java:
public boolean equals(Object o) {
      if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
  }
 
M

MoD

Gast
Genauer geht es um die (2), dass this == o?!
Dann verstehe ich das instanceof (5f) immernoch nicht genau. Es klärt ob es gleich 0 ist und überprüft irgendwelche Typen?!??
und dieses " Uhrzeit u = (Uhrzeit) o " in (8) check ich nicht. mit den ( .. ) um Uhrzeit
Allgemein verwirrt mich dieses zweimal true. Kann denn nicht in einem bestimmten Fall 2x true ausgegeben werden? Durch (2f) und das return... ab (9) ?!?!
 

eRaaaa

Top Contributor
Genauer geht es um die (2), dass this == o?!
Dann verstehe ich das instanceof (5f) immernoch nicht genau. Es klärt ob es gleich 0 ist und überprüft irgendwelche Typen?!??
und dieses " Uhrzeit u = (Uhrzeit) o " in (8) check ich nicht. mit den ( .. ) um Uhrzeit
Allgemein verwirrt mich dieses zweimal true. Kann denn nicht in einem bestimmten Fall 2x true ausgegeben werden? Durch (2f) und das return... ab (9) ?!?!

Wenn einmal ein return kommt, wird die Methode beendet..also nicht weitergearbeitet, dahe rmacht man auch oft das

this==o ...denn wenn die eh auf das gleiche Objekt zeigen, müssen sie gleich sein und somit kann man sich den Rest des Prüfens sparen...
Instanceof macht man, damit man sich den null-check spart + damit man keine CastExcepion bekommt..da man ja auf Uhrzeit castet. Die MEthode kann ja jegliches Objekt übergeben bekommen!
Ja und der Rest prüft dann halt ob die Attribute (stunden,min, sek) halt gleich sind...
 
M

MoD

Gast
So weit, so gut. Verstanden :)
Kannst du mir das
Java:
        Uhrzeit u = (Uhrzeit) o;
nochmal ganz klein erklären? Mit den ()
 

eRaaaa

Top Contributor
Das ist ein cast. Vor dem Zeitpunkt, ist o ein normales Objekt für die Methode vom Typ Objekt ;D
Was bedeutet, du kannst darauf keine Methoden aus Uhrzeit aufrufen z.b. getStunden()., also musst du das Objekt wieder zu einem Uhrzeit-Objekt machen indem du auf Uhrzeit castest (da du ja weisst dass es ein Uhrzeit-Objekt ist, durch den instanceof- Test, gibt es dann da auch keine CastException).

Danach ist das Objekt o, bzw jetzt ist es ja u, halt eine Uhrzeit und du kannst darauf die Methodne aufrufen !
 

Sduni

Mitglied
und warum nicht einfach:

Java:
public boolean equals(Uhrzeit o) {
      if (this == o) 
            return true;
      return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
      this.sekunden == u.getSekunden();  
  }
 

Landei

Top Contributor
Du meinst sicher equals(Uhrzeit u). Du kannst natürlich so eine Methode schreiben, das ist aber nicht mehr die, die normalerweise zum Vergleichen verwendet wird. Andere Klassen, die vergleichen können müssen (wie z.B. Sets), wissen ja nicht, dass du so eine Methode hast (können sie nicht, sind ja Jahre vor deiner Uhrzeit-Klasse geschrieben). Sie wissen nur, das alle Objekte eine equals(Object) Methode haben (da die Klasse Object so eine hat, und alle anderen Klassen direkt oder indirekt von dieser Klasse erben), und deshalb verlassen sie sich auf diese, und nicht auf deine (für sie unbekannte) Methode.
 

eRaaaa

Top Contributor
Naja, was heißt Fehler?! Du erhältst unter Umständen nicht das von dir erwünschte Ergebnis.
Bei dem Beispiel von dem von Landei angesprochenen Set: Man erwartet, dass nur unterschiedliche Objekte in einem Set sind! Dazu wird unteranderem die equals-Methode von dem Set benutzt, um den Vergleich zu vollziehen. Wenn du nun "deine" equals-Methode implementieren würdest, würde das Set die nicht beachten, weil sie eben nur die equals-Methode mit der bestimmten Signatur benutzt. Diese musst du also überschreiben, anstelle von überladen :)

Java:
	Uhrzeit u1 = new Uhrzeit(11, 11, 11);
	Uhrzeit u2 = new Uhrzeit(11, 11, 11);
	Set<Uhrzeit> uhrzeiten = new HashSet<Uhrzeit>(Arrays.asList(u1,u2));
	System.out.println(uhrzeiten.size());

Würde mit deiner equals-Methode (und entsprechender hashCode Implementierung) 2 liefern, obwohl die Objekte ja vom Inhalt eig. die gleichen sind, mit der o.g. equals, würde das von uns erwartete Ergebnis 1 herauskommen.
 

Neue Themen


Oben