Java Java, eine Menge ifs und else

bawde

Lt. Commander
Registriert
Juli 2006
Beiträge
1.175
Hi, ich bin totaler Anfänger in java und möchte gerne mein erstes Programm schreiben, einen Timer.

Nun habe ich ich damit angefange, dass das Programm einfache Zeiteingaben in Sekunden, Minuten und Stunden richtig umrechnen kann, also z.b. 120 Sekunden in 0 Std., 2 Min. und 0 Sekunden. Das klappt auch soweit, nur ist meine Frage: Das geht doch sicherlich kürzer, schlauer und sinnvoller?

Hier ein Ausschnitt nur vom main und den Sekunden:
PHP:
public class meintimer {

  int stunden,minuten, sekunden = 0;
    
  public static void main(String[] args) {
      meintimer i = new meintimer();
      i.sekunden(180);
      i.minuten(0);
      i.stunden(0);
    }
   
  public void  sekunden(int sek){
      //zwischen 0 und 60 Sekunden
      if ( sek <= 59 && sek >= 0 ){
       System.out.println("Es sind Sekunden: "+sek);
     }
     //größer 60 Sekunden
     else if (sek >= 60){
         while (sek > 60){ 
            sek = sek - 60;
            minuten = minuten + 1;   
     } //größer 60 Sekunden und falls wieder genau 60 Sekunden
         if(sek == 60)
           {minuten = minuten + 1;   
            sek = 0;
            System.out.println("Es sind Sekunden: "+sek);}
         else{System.out.println("Es sind Sekunden: "+sek);}
     }
     //unter 0 Sekunden
     else { System.out.println("Die Sekunden sind kleiner 0");
     }  
    sekunden = sek;  
   }

Ausgabe:
Code:
run:
Es sind Sekunden: 0
Es sind Minuten: 3
Es sind Stunden: 0
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 0 Sekunden)
 
Zuletzt bearbeitet:
Schau dir mal den Operator % (mod) an. Damit geht das wesentlich eleganter... Möchte dir jetzt aber nicht den ganzen Quelltext vorgeben :)
 
PHP:
int hours = sek / 3600;
int minutes = (sek - hours * 3600) / 60;
int seconds = sek - hours * 3600 - hours * 60;

ich hoffe ich habe auf die schnelle nichts übersehen...
 
@Icebreaker
Ich schätze er möchte nur umrechnen falls es sinnvoll ist. Er will also nicht zum Beispiel 0,000277777778 Stunden als Ausgabe erhalten ;)

@TE
Wie Ni schon sagte: Modulo ist dein Freund.
 
Ich würde es wohl so machen:
PHP:
public static void main(String[] args) {
	MyTime t = new MyTime();
	t.sekunden(3675);
}

	
public void sekunden(int sec){
	int minuten = sec / 60;
	int sekunden = sec % 60;
	
	int stunden = minuten / 60;
	minuten = minuten % 60;
	
	System.out.println(stunden + "std " + minuten + "min " + sekunden + "sek");
}

Ausgabe in diesem Fall:
1std 1min 15sek

edit: für die methoden minuten und stunden kannste dir ja mit den neuen Erkenntnissen selbst was überlegen.
 
Zuletzt bearbeitet:
Smagjus schrieb:
@Icebreaker
Ich schätze er möchte nur umrechnen falls es sinnvoll ist. Er will also nicht zum Beispiel 0,000277777778 Stunden als Ausgabe erhalten ;)

mache ich doch auch nicht ;)
Ein Int dividiert durch ein Int bleibt in Java immernoch ein Int, von daher sollte haargenau das Gleiche wie bei bawde herauskommen.
 
so, nun sieht das ganze so aus
PHP:
public class meintimer {

  int stunden,minuten, sekunden;
    
  public static void main(String[] args) {
      meintimer timer = new meintimer();
      timer.zeit(1,0,100);
   //   i.minuten(0);
   //  i.stunden(0);
    }
  public void zeit (int stunden, int minuten, int sekunden){
   minuten = sekunden / 60 + minuten;
   stunden = minuten / 60 + stunden;
   minuten = minuten % 60;
   sekunden = sekunden % 60;
   
   System.out.println("Stunden: "+stunden);
   System.out.println("Minuten: "+minuten);
   System.out.println("Sekunden: "+sekunden);
   }

Ausgabe:
PHP:
run:
Stunden: 1
Minuten: 1
Sekunden: 40
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 0 Sekunden)

das spart mehr als 100 zeilen code, danke!
 
Für den Anfang ist es schon ok, die Umrechnungen selbst durchzuführen. Wenn man damit sein Geld verdient, ist man halt versucht, möglichst wenig Code selbst zu schreiben und möglichst viel Code wieder zu verwenden.

Wenn die Runtime bereits entsprechende Funktionen bietet, ist das oft die beste Wahl. Die APIs sind über die Jahre definitiv besser geworden. Die Date API ist nicht sehr gelungen, weshalb es entsprechende Alternativen gibt, namentlich Joda Time.

Für die Zeitmessung beobachtet man überlicherweise lediglich einen Wert und berechnet daraus alle anderen. Seit Java 5 gibt es hierfür bereits genannte Klasse, die das schön kapselt. Wenn man einen statischen Import setzt, sieht der Code dann z.B. so aus:

Code:
import static java.util.concurrent.TimeUnit.*;

class Demo {
    public static void main(String... args) {
        long time = System.currentTimeMillis();

        // do your work ...

        long elapsed = System.currentTimeMillis() - time;

        long hours = MILLISECONDS.toHours(elapsed);
        long minutes = MILLISECONDS.toMinutes(elapsed);
        long seconds = MILLISECONDS.toSeconds(elapsed);
    }
}

Selbst wenn man keine Ahnung von Java hat, sollte das recht leicht verständlich sein. Und das ist oft ein ganz entscheidendes Kriterium: schreibe keinen kryptischen Code, der schwer zu verstehen ist (und zwar auch von Dir selbst, wenn Du ein Jahr später noch einmal eine Änderung vornehmen willst/musst), sondern Code der möglichst einfach und leicht verständlich ist (oder zumindest gut dokumentiert).
 

Ähnliche Themen

Zurück
Oben