Sekunden in Stunden, Minuten und Sekunden umrechnen

71477
Oompa Loompa

Die folgende Frage wurde von Absolute Java 5th ed. von Walter Savitch:

Schreiben Sie ein Programm, das die Anzahl der Stunden, Minuten und Sekunden ausgibt, die insgesamt 50.391 Sekunden beträgt. Die Ausgabe sollte 13 Stunden, 59 Minuten und 51 Sekunden betragen. Testen Sie Ihr Programm mit einer anderen Anzahl von Sekunden, um sicherzustellen, dass es für andere Fälle funktioniert.

Dies ist der Code, den ich geschrieben habe:

    public class Question7 {

    private static final int MINUTES_IN_AN_HOUR = 60;
    private static final int SECONDS_IN_A_MINUTE = 60;

    public static void main(String[] args) {

        int seconds = 50391;

        System.out.println(timeConversion(seconds));

    }

    private static String timeConversion(int totalSeconds) {
        int hours = totalSeconds / MINUTES_IN_AN_HOUR / SECONDS_IN_A_MINUTE;
        int minutes = (totalSeconds - (hoursToSeconds(hours)))
                / SECONDS_IN_A_MINUTE;
        int seconds = totalSeconds
                - ((hoursToSeconds(hours)) + (minutesToSeconds(minutes)));

        return hours + " hours " + minutes + " minutes " + seconds + " seconds";
    }

    private static int hoursToSeconds(int hours) {
        return hours * MINUTES_IN_AN_HOUR * SECONDS_IN_A_MINUTE;
    }

    private static int minutesToSeconds(int minutes) {
        return minutes * SECONDS_IN_A_MINUTE;
    }
}
Antworten
9

2 Antworten auf die Frage

17
Martin R

Ihre Verwendung von Hilfsfunktionen ist nicht konsistent: Einige Berechnungen werden inline durchgeführt, z

int hours = totalSeconds / MINUTES_IN_AN_HOUR / SECONDS_IN_A_MINUTE;

und andere (ebenso einfache) Berechnungen werden mit den Funktionen hoursToSeconds()und durchgeführt minutesToSeconds().

Mein Hauptpunkt ist jedoch, dass die Berechnung zu kompliziert ist, und eine Erweiterung auf weitere Zeiteinheiten (z. B. Tage) würde es noch komplizierter machen.

Es ist einfacher, wenn Sie zuerst die niedrigste Zeiteinheit (Sekunden) mit dem Restoperator berechnen %und dann mit den höheren Zeiteinheiten (Minuten, dann Stunden) fortfahren.

Dann benötigen Sie keine zusätzlichen Funktionen für die Konvertierung und können daher den Umfang der Konvertierungskonstanten auf die timeConversion()Funktion beschränken.

private static String timeConversion(int totalSeconds) {

    final int MINUTES_IN_AN_HOUR = 60;
    final int SECONDS_IN_A_MINUTE = 60;

    int seconds = totalSeconds % SECONDS_IN_A_MINUTE;
    int totalMinutes = totalSeconds / SECONDS_IN_A_MINUTE;
    int minutes = totalMinutes % MINUTES_IN_AN_HOUR;
    int hours = totalMinutes / MINUTES_IN_AN_HOUR;

    return hours + " hours " + minutes + " minutes " + seconds + " seconds";
}
4
Emanuele Paolini

Ich weiß, dass Effizienz in einer solchen Funktion das letzte ist, worüber man sich Sorgen machen muss. Ich würde jedoch die Antwort von @Martin R wie folgt umschreiben:

private static String timeConversion(int seconds) {

    final int MINUTES_IN_AN_HOUR = 60;
    final int SECONDS_IN_A_MINUTE = 60;

    int minutes = seconds / SECONDS_IN_A_MINUTE;
    seconds -= minutes * SECONDS_IN_A_MINUTE;

    int hours = minutes / MINUTES_IN_AN_HOUR;
    minutes -= hours * MINUTES_IN_AN_HOUR;

    return hours + " hours " + minutes + " minutes " + seconds + " seconds";
}

Ich fühle mich immer wohler, wenn nicht beide Operationen a/bund a%bwerden separat berechnet, da die zweite kann in Bezug auf die erste durch Summen- und Multiplikation (die sind viel effizienter Operationen) berechnet werden. Auch dieser alternative "Strom des Denkens", dh die Eingabewerte müssen so lange geändert werden, bis sie die Anforderungen erfüllen, erfordert weniger Vorstellungskraft, um die Namen von Variablen zu finden.