Merge mit MLinkedList - abweichende Testergebnisse im Testatmodus

UnkownIdentity
Erstie
Erstie
Beiträge: 11
Registriert: 7. Mai 2017 14:58

Merge mit MLinkedList - abweichende Testergebnisse im Testatmodus

Beitrag von UnkownIdentity » 6. Jul 2017 15:20

Hallo zusammen,

ein kleiner Hinweis bezüglich, merkwürdigerweise, abweichender Testergebnisse im Testatmodus bei der Merge Aufgabe für Linked Lists: Ein Veränderung der Parameter à la left = left.getNext() war irgendwie nicht möglich. Zwar wurde einwandfrei compiled, aber eine Abbruchbedingung left==null der while-Schleife wurde nie erreicht, so dass die Schleife nie terminiert (respektive auch für right). Ich vermute dass die Parameter aus irgendeinem Grund nicht verändert wurden oder werden können. Der folgende Code funktioniert also im Übungsmodus, nicht aber im Testat:

Code: Alles auswählen

public MListElement<T> executeMerge(MListElement<T> left, MListElement<T> right, Comparable_Comparator<T> comp)
{
    MListElement<T> curr, start;
    if (comp.compare(left.getKey(), right.getKey()) > 0) {
        curr = right;
        right = right.getNext();
    } else {
        curr = left;
        left = left.getNext();
    }
    start = curr;
    while (left != null && right != null) {
        if (comp.compare(left.getKey(), right.getKey()) > 0) {
            curr.setNext(right);
            right = right.getNext();
        } else {
            curr.setNext(left);
            left = left.getNext();
        }
        curr = curr.getNext();
    }
    if (left == null) {
        curr.setNext(right);
    } else {
        curr.setNext(left);
    }
    return start;
}
Hier schlugen alle Tests - mit einer Ausnahme - aufgrund von Timeout fehl. Der folgende Code erfüllte jedoch auch im Testat alle Tests:

Code: Alles auswählen

public MListElement<T> executeMerge(MListElement<T> left, MListElement<T> right, Comparable_Comparator<T> comp)
{
    MListElement<T> curr, start, left_l = left, right_r = right;
    if (comp.compare(left_l.getKey(), right_r.getKey()) > 0) {
        curr = right_r;
        right_r = right_r.getNext();
    } else {
        curr = left;
        left_l = left_l.getNext();
    }
    start = curr;
    while (left_l != null && right_r != null) {
        if (comp.compare(left_l.getKey(), right_r.getKey()) > 0) {
            curr.setNext(right_r);
            right_r = right_r.getNext();
        } else {
            curr.setNext(left_l);
            left_l = left_l.getNext();
        }
        curr = curr.getNext();
    }
    if (left_l == null) {
        curr.setNext(right_r);
    } else {
        curr.setNext(left_l);
    }
    return start;
}
Schiebt die Parameter also am besten auch auf eine lokale Variable, falls ihr ebenfalls Timeouts erhaltet obwohl der Code korrekt wirkt. Erspart gut 15 Minuten Fehlersuche ;)
Leider fehlte mir die Zeit damit an anderer Stelle. Es geht zwar nur noch um den Bonus, aber wenn einem dann lediglich ein paar Punkte fehlten, ist das schon ärgerlich den eigentlich korrekten Code mühsam zu debuggen. Gibt es einen offiziellen Ansprechpartner bezüglich solcher Testatprobleme bei Codemonkeys? Im moodle ist nix zu finden. Ich werde einfach mal in eine der Codemonkeys Sprechstunden gehen, dennoch wäre es schön hierzu etwas von offizieller Seite zu hören

LG

Zurück zu „Archiv“