Time Formatter

SuperSheriff

Mitglied
Guten Tag zusammen,

Wie dem titel ja schon zu entnehmen ist geht es um die Umrechnung verschiedener Zeiten und zwar sollen wir von Mikrosekunden in sekunden und dann ins format mm:ss umrechnen.

der gneau Wortlaut ist:

"Innerhalb des vorliegenden Projektes sollen Zeitangaben wie Abspieldauer oder die aktuelle Position im Lied bei der Ausgabe in der grafischen Oberfläche immer im Format mm:ss dargestellt werden, d.h. es gibt immer zwei Ziffern für die Minutenangabe und zwei Ziffern für die Sekundenangabe, wobei die beiden Angaben durch einen Doppelpunkt getrennt sind.

Für die interne Verarbeitung selbst werden die Zeiten in Mikrosekunden verwaltet, so dass hier eine Umrechnung erforderlich ist. Nach der Umrechnung von Mikrosekunden in das Format mm:ss werden verbleibende Sekundenbruchteile ignoriert. d. h. etwaige Nachkommastellen werden verworfen und es wird nicht gerundet. So führt etwa die intern verwaltete Abspieldauer von 305862000 Mikrosekunden zu einer Ausgabe des Strings "05:05" (05 Minuten und 05 Sekunden).

Die Aufbereitung der intern in Mikrosekunden gespeichert Zeiten als formatierten String wird sowohl für die Angabe der Gesamtabspieldauer als auch für die Ausgabe der aktuellen Position im Lied benötigt. Es bietet sich daher an, diese Funktionalität in eine Hilfsfunktion auszulagern.

Implementieren Sie in der Klasse TaggedFile die Methode public static String timeFormatter(long microtime)

Die Methode wandelt eine Zeitangabe in Mikrosekunden nach den obigen Angaben in das Format "mm:ss" um. Erstellen und nutzen Sie während der Implementierung der Methode timeFormatter() zusätzlich Unit-Tests. Fügen Sie Ihre Tests der Datei UTestTaggedFile hinzu.

Im folgenden ist ein Muster für einen Unit-Test angegeben:"
Die Junittests habe ich schon implementiert und füge sie weiter unten an!

"Die Methode timeFormatter() soll auch die beiden nachfolgenden Möglichkeiten für fehlerhafte
bzw. problematische Argumentwerte behandeln:

1. Der übergebene Zeitwert in Mikrosekunden ist negativ. In diesem Fall soll die Methode folgende Ausnahme (Exception) generieren: throw new RuntimeException("Negativ time value provided");

2. Der übergebene Zeitwert in Mikrosekunden ist zu groß für das Format "mm:ss". In diesem Fall soll die Methode folgende Ausnahme (Exception) generieren: throw new RuntimeException("Time value exceeds allowed format");

Hinweis: überlegen Sie sich zuerst, ab welchem Wert ein Überlauf auftreten wird.
Die korrekte Auslösung von Ausnahmen (Exceptions) kann durch Unit-Tests der folgende Art getestet werden. Fügen Sie Ihre Tests wieder der Datei UTestTaggedFile hinzu."

Entschuldigung für den langen Text aber wenn ich es kürze können misverständnisse auftreten. Im Prinzip ist die Formatter Methode nich wirklich kompliziert und ich hänge an den Junittests fest, welche mir ehrlich gesagt generell noch etwas fremd sind.

Hier nun mein Code:

Java:
public static String timeFormatter(long  microtime){
      
        //Negative value of microtime
        if(microtime < 0){
            throw new RuntimeException("Negative Time value provided");
        }
      
        //Transformation from microseconds to seconds
        long timeInSeconds = microtime / 1000000;
      
        //Checking out of range 99:59 (mm:ss)
        if(timeInSeconds > 5999){
            throw new RuntimeException("Time value exceeds allowed format");
        }
      
        //Transformation in mm:ss
        long TimeInMinutes = timeInSeconds / 60;
        timeInSeconds = timeInSeconds  - (TimeInMinutes * 60);
        String parsedTime = "";
      
        if(TimeInMinutes < 10){
            parsedTime = "0" + TimeInMinutes;
        }else{
            parsedTime = "" + TimeInMinutes;
        }
        parsedTime = parsedTime + ":";
        if(timeInSeconds < 10){
            parsedTime = parsedTime + "0" + timeInSeconds;
        }else{
            parsedTime = parsedTime + "" + timeInSeconds;
        }
      
        return parsedTime;
    }

Hier noch die Junittests: (Der Junittest public void test_timeFormatter_12() stammt von mir und ist fehlerhaft. Die anderen Junittests habe ich lediglich aus dem Aufgabenblatt übernommen und funktionieren auch)

Java:
import junit.framework.TestCase;

public class UTestTaggedFile extends TestCase {
  
    public void test_play_01() throws Exception{
        TaggedFile tf = new TaggedFile("audiofiles/Motiv 5. Symphonie von Beethoven.ogg");
        tf.play();
        tf.stop();
    }
  
    public void test_timeFormatter_10() throws Exception {
        assertEquals("Wrong time format", "05:05",
                TaggedFile.timeFormatter(305862000L));
    }
  
    public void test_timeFormatter_08() throws Exception {
        try{
            TaggedFile.timeFormatter(-1L);
            fail("Time value underflows");
        }    catch (RuntimeException e){
        }
    }
  
    public void test_timeFormatter_12() throws Exception {
        try{
            TaggedFile.timeFormatter(5999000001L);
            fail("Time Value exceeds allowed format");
        }catch(RuntimeException e){
        }
    }
  

}

Vielen Dank im Voraus!

Ich hoffe ihr könnt mir weiterhelfen.
 

SuperSheriff

Mitglied
Ok, also bei dem Junittest wie die Methode nun aussehen muss. Stimmt das so? Also die test_timeFormatter 12 Und falls sie richtig ist warum krieg ich bei egal welchen wert ich eingebe einen Fehler?
 

BuckRogers

Bekanntes Mitglied
Hi,

timeInSeconds ist genau gleich 5999, dein if-Statement besagt aber:

Java:
if(timeInSeconds > 5999) {...}

Siehst du die Ursache?
 

SuperSheriff

Mitglied
Ah verdammt ich habe mit 5,999,000,001L ms gerechnet was ja eigentlich größer ist als 5999s. Aber da ich mit long rechne ( gewollt, weil es nachkomma stellen abschneidet) kommt bei der umrechnung von mikrssekunden in sekunden 5999s raus was nicht in if reingeht. Ja hätte ich selbst drauf kommen müssen *kofschüttel*

Vielen Dank für deine Hilfe :)
 

SuperSheriff

Mitglied
Ich hätte noch eine Frage, ist eigentlich ein neues Thema aber vlt kann ich es hier anfügen.
Es geht um maps und zwar sollen wir mit der Methode studiplayer.basic.TagReader.readTags() title,author,album und duration rauslesen. Wir hatten noch keine maps was mich ehrlich gesagt auch verwundert warum es überhaupt als aufgabe dran kommt, aber ist ja egal jetzt.

Java:
public void readAndStoreTags(String pathname){
        Map <String,Object> tagMap = studiplayer.basic.TagReader.readTags(pathname);
      
        for( String key: tagMap.keySet()){
           tagMap.get(key);
        }
    }

Das hab ich jezt schon mal als grundgerüst aber wie lese ich die map richtig aus bzw prüfe ob ein Wert Null,leerstring oder 0 ist? Auch ist mir das Konstrukt map noch im allgemeinen schleierhaft ich habe also immer einen Key und ein object? Und das objekt spreche ich mit dem Key an oder wie funktioniert das?
 
Zuletzt bearbeitet:

BuckRogers

Bekanntes Mitglied
Hi,

ja das ist wirklich ein neues Thema. Daher schlage ich vor, dass du in der Sparte Hausaufgaben einfach mal einen neuen Thread aufmachst. Und da packst du am besten alles rein was du hast, nicht nur einen Schnipsel von Code. Damit kann man nämlich nichts anfangen. Was Maps sind, lernst du am besten wenn du einmal danach googelst("java maps tutorial deutsch"). Das liest du dir in Ruhe durch, so dass du die basics verstehst(musst ja nicht alles verstehen).
Maps an sich sind Collections(Also ne Sammlung von Daten). Jedes einzelne Stück besteht aus einem Key((primitiver Datentyp) dieser ist eindeutig in der gesamten map) und dem dazugehörigen Value(Was auch immer das ist... Object, String oder sonstwas).
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben